HRESULT:0x80040154带有CLSID {}的COM对象无效或未注册

时间:2010-01-04 12:24:24

标签: c# .net com object clsid

我在C#.NET 1.1应用程序中使用COM对象。当COM对象未在客户端计算机上注册时,我得到例外:

  

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

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

3 个答案:

答案 0 :(得分:1)

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

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

如果你想在世界范围内找到可能存在的任何可能的图书馆,我现在就放弃并喝点咖啡。

答案 1 :(得分:1)

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

  • 在注册表中查找CLSID(HKEY_CLASSES_ROOT\CLSID\{...}
  • 如果未找到,只需抛出以显示常规错误消息
  • 根据对象的类型查看相应的子项(例如,InProcServer32用于进程内本机COM DLL / OCX)。默认值将是DLL / OCX的路径。
  • 检查是否存在此路径,并使用文件名构建合适的消息。

这使您可以在移动OCX / DLL时显示不同的消息,但如果没有注册,则无法提供帮助。

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

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

在失败的客户端计算机上识别事件的确切顺序可能有点挑战,但值得尝试。

答案 2 :(得分:0)

如果我理解正确,你会收到消息“我不知道如何为这个GUID找到COM对象”并想要做得更好......? 换句话说:通常你注册COM对象,它的类id或ProgId引用它。现在,windows不知道你的目标对象。

我不知道该怎么做。如果您的COM对象是.Net程序集,您可以使用Reflection迭代程序目录中的文件列表并查找相关属性,并将其与错误消息进行比较。 如果它们是本地库,那么可能有P / Invoke方法也可以这样做,但我不知道Google到目前为止并没有帮助。

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