2

我正在尝试创建一个 COM 对象的实例。我有实现接口的类名,并通过使用 CLSIDFromProgID() 获得 CLSID。因此,由于我获得了 CLSID,我认为从现在开始一切都会好起来的。但是,当我调用 CreateInstance 并传入 CLSID 时,我收到一条错误消息,提示“类未注册”。我也只在某些计算机上收到此错误。它在多台计算机上运行无错误。我不明白问题可能出在哪里。我的注册表脏了吗?有谁知道这里发生了什么?谢谢你的帮助!

我只想补充一点,这是一个 .NET COM 类。相应的条目位于注册表中,DLL 位于 GAC 中。

4

4 回答 4

2

CLSIDFromProgId 只是在注册表中查找 ProgId 的名称并将其转换为 CLSID,它不必查看注册表之外的任何内容,甚至无需检查是否有某些东西实际上正在实现该 CLSID。

当您在 CLSID 上调用 CreateInstance 时,Windows 将在注册表中查找对象应如何实例化(通常是 exe 或 dll)。然后它将尝试加载 dll(或启动 exe)并从中创建对象。

MSDN 中有很多关于所涉及过程的文档,例如参见“ COM 类对象和 CLSID ”,如果你做了很多 COM 工作,那么值得从第一任负责人那里学习该过程,因为它可以节省大量时间调试此类问题时很麻烦。

于 2008-11-03T21:32:10.193 回答
1

这是注册表中的两步过程。您使用 ProgID 来获取 CLSID。然后,当您调用 CreateInstance 时,COM 会使用 CLSID 查找 dll 的路径。您可以自己使用 regedit 来查找 CLSID 并查看该条目的外观。

于 2008-11-03T21:31:22.537 回答
1

感谢您的回答。.Net 程序集已正确注册并存在于 GAC 中。一个绝对证实了这一点的应用程序是 Process Explorer。您可以查看每个应用程序加载的 dll。所以从这里我可以看到实例化 COM 对象的应用程序是否真的能够加载 DLL。我发现这确实发生了。问题是由于不同的区域设置。我们发现当地区没有设置为美国时,应用程序抛出了异常。此问题已修复。错误消息“类未注册”不是很有帮助。谢天谢地,这是一个快速修复。

于 2008-11-05T19:55:54.880 回答
0

以 shell32 为例,您可以像这样创建一个新实例;

var shl = (Shell) Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));

这将获得对现有组件的引用;

var shl2 = (Shell) Marshal.GetActiveObject("Shell.Application");

这是有关如何在IronPython中执行相同操作的参考。

** 注意,这使用了 progid,clsid 几乎相同,只需使用 Type.GetTypeFromCLSID({GUID})。

于 2009-11-16T14:18:55.167 回答