CLSIDFromProgID成功但CreateInstace失败! 为什么?(CLSIDFro

2019-10-21 01:11发布

我想创建一个COM对象的实例。 我有一个实现该接口的类的名字,我得到一个CLSID使用CLSIDFromProgID()。 所以,因为我得到一个CLSID我想一切都应该罚款从现在开始。 然而,当我做的CreateInstance调用,并传入CLSID,我得到一个错误说“未注册的类”。 此外,我只在某些计算机出现此错误。 它运行无差错多台计算机上。 我不明白问题出在哪里可能。 是我的注册表脏? 有谁知道这是怎么回事? 谢谢你的帮助!

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

Answer 1:

这是在注册表中的两个步骤。 你用的ProgID获得CLSID。 然后,当你调用的CreateInstance,COM然后使用CLSID找到路径的dll。 您可以使用注册表编辑器自己来查找CLSID,看到入口的样子。



Answer 2:

CLSIDFromProgId简直是在注册表中查找该PROGID的名称,将其转换成CLSID,它没有看超出注册表什么,甚至检查什么实际执行的是CLSID。

当你调用的CreateInstance的CLSID,Windows将查找在注册表中找到了对象应该如何实例化(通常是一个EXE或DLL)。 然后,它会尝试加载的dll(或启动该exe),并从它创建对象。

有很多涉及的过程中MSDN文档,例如见“ COM类对象和CLSID的 ”,如果你做了很多COM的工作是值得借鉴第一校长的过程,因为它可以节省大量的时间和调试这一类问题时的麻烦。



Answer 3:

谢谢您的回答。 .NET程序集是正确注册和人出席在GAC。 这绝对是证实了这一点的一个应用是进程资源管理器。 您可以查看每个应用程序加载的DLL。 所以从这里我可以看到,如果这是实例化的COM对象的应用程序实际上是能够加载DLL或没有。 我发现这确实发生了。 这个问题是由于不同的区域设置。 我们发现,应用程序抛出一个异常时,该区域未设置为美国。 此问题已得到解决。 “类没有注册”的错误信息是不是非常有帮助。 值得庆幸的是,这是一个快速解决。



Answer 4:

使用SHELL32作为一个例子,你可以创建像这样一个新的实例;

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

这将AQUIRE一个refernce到现有组件;

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

下面是如何做相同的参考IronPython的 。

**请注意,这使用的ProgID,CLSID是几乎相同的,只是使用Type.GetTypeFromCLSID({GUID})。



文章来源: CLSIDFromProgID is successful but CreateInstace fails! Why?