我在C#.NET 1.1应用程序中使用COM对象。当COM对象未在客户端计算机上注册时,我得到例外:
“具有CLSID {}的COM对象也是 无效或未注册。“ (HRESULT:0x80040154的)
我知道如何使用regsvr32注册COM对象。我们的要求是识别未注册的COM对象。我们不想硬编码COM对象的名称,而是使用COM Exception / HResult动态识别它。有什么想法吗?
答案 0 :(得分:1)
解决您描述的问题的唯一方法是为要检查的所有对象提供CLSID的全局列表。
如果你只关心几个库,你可以安装它们,检查它们的GUID,并自己构建这个数据库。
如果你想在世界范围内找到可能存在的任何可能的图书馆,我现在就放弃并喝点咖啡。
答案 1 :(得分:1)
鉴于Benjamin Podszun的回答中提到的情况,您的方法可能是:
HKEY_CLASSES_ROOT\CLSID\{...}
)这使您可以在移动OCX / DLL时显示不同的消息,但如果没有注册,则无法提供帮助。
您可能还想花些时间尝试理解为什么(甚至five whys!)组件在某些客户端计算机上移动/取消注册,这可能会提示一种防止它的方法。例如,一种可能的方案是用户安装版本1,然后安装版本2,然后卸载版本1.根据安装程序的实现方式,卸载版本1可以取消注册或删除版本2所需的组件。
另一种方法可能是查看安装程序与普通用户和管理员的行为方式。
在失败的客户端计算机上识别事件的确切顺序可能有点挑战,但值得尝试。
答案 2 :(得分:0)
如果我理解正确,你会收到消息“我不知道如何为这个GUID找到COM对象”并想要做得更好......? 换句话说:通常你注册COM对象,它的类id或ProgId引用它。现在,windows不知道你的目标对象。
我不知道该怎么做。如果您的COM对象是.Net程序集,您可以使用Reflection迭代程序目录中的文件列表并查找相关属性,并将其与错误消息进行比较。 如果它们是本地库,那么可能有P / Invoke方法也可以这样做,但我不知道Google到目前为止并没有帮助。
我很想理解这个要求:既然您正在分发该应用并且知道依赖项,那么为什么要添加这个额外的复杂层呢?