0

我在我的 C# .NET 1.1 应用程序中使用 COM 对象。当 COM 对象未在客户端计算机上注册时,出现异常:

“具有 CLSID {} 的 COM 对象无效或未注册。” (HRESULT:0x80040154)

我知道如何使用 regsvr32 注册 COM 对象。我们的要求是识别未注册的 COM 对象。我们不想硬编码 COM 对象的名称,而是使用 COM Exception/HResult 动态识别它。有任何想法吗?

4

3 回答 3

1

解决您描述的问题的唯一方法是为您要检查的所有对象提供一个全局 CLSID 列表。

如果你只关心几个库,你可以安装它们,检查它们的 GUID,然后自己构建这个数据库。

如果你想找出世界上任何可能存在的图书馆,我现在就放弃,喝杯咖啡。

于 2010-01-04T12:32:23.430 回答
1

鉴于对 Benjamin Podszun 的回答的评论中提到的情况,您的方法可能是:

  • 在注册表中查找 CLSID ( HKEY_CLASSES_ROOT\CLSID\{...})
  • 如果没有找到,只需 throw 以便显示通用错误消息
  • 根据对象的类型查看适当的子项(例如,InProcServer32 用于进程内本机 COM DLL/OCX)。默认值为 DLL/OCX 的路径。
  • 检查此路径是否存在,并使用文件名制作合适的消息。

如果 OCX/DLL 已被移动,这使您可以显示不同的消息,但如果未注册它当然无济于事。

您可能还想花一些时间尝试了解为什么(甚至五个为什么!)组件在某些客户端计算机上被移动/取消注册,这可能会提出一种防止它的方法。例如,一种可能的情况是用户安装版本 1,然后安装版本 2,然后卸载版本 1。根据安装程序的实施方式,卸载版本 1 可能会取消注册或删除版本 2 所需的组件。

另一种方法可能是查看安装程序作为普通用户与管理员的行为方式。

确定发生故障的客户端计算机上的确切事件顺序可能有点挑战,但值得一试。

于 2010-01-04T13:28:11.997 回答
0

如果我理解正确,您会收到消息“我不知道如何找到此 GUID 的 COM 对象”并且想要做得更好..?换句话说:通常您会注册 COM 对象,并由其类 ID 或 ProgId 引用。目前 windows 不知道您的目标对象。

我不知道该怎么做。如果您的 COM 对象是 .Net 程序集,您可能能够使用反射来遍历程序目录中的文件列表并查找相关属性,并将其与错误消息进行比较。如果它们是本机库,则可能有 P/Invoke 方法来做同样的事情,但我不知道怎么做,谷歌到目前为止也没有帮助。

不过我很想了解这个要求:既然您正在分发该应用程序并且知道依赖项,那么为什么要添加这个额外的复杂层呢?

于 2010-01-04T12:35:22.583 回答