我用Visual Studio 2013创建了一个带有COM接口的c ++ DLL。 DLL随着注册一起安装。 在Ole Object Viewer中,我可以看到这个DLL的类型库 导出的功能。 regsvr32完成没有任何错误。
在C#中我无法使用,因为创建失败并出现错误0x80040154 - 没有找到或没有注册的课程。
这不是一个平台问题。 64位版本在system32和32bit syswow64中的版本,他们在那里注册了typelibary信息 在OLE对象查看器中确认了这一点。
但该类未列在OLE对象查看器树中。
Habe noe想知道什么是缺失或错误的。
更重要的是,我有一个simliar VC ++项目,可以看到这个COM / DLL 在OLE对象查看器中的视图中。它被编译,链接 并以完全相同的方式安装。
我已经比较了所有编译器,链接器和MIDL设置,检查了.idl 项目中的文件,.rgs文件......除了相似之外似乎都是一样的 不同的名字和指南。
所以这很奇怪:一个在树中显示为COM对象 OLE对象查看器,可以在C#程序中使用,另一个不能。
请注意:使用此DLL / COM的C#项目中没有编译器错误。 创建0x80040154时存在运行时错误。
总结:我必须将COM / DLL,两个视觉研究项目,部署在同一个 方式,一个可以在OLE对象树中看到,可以在C#中使用,另一个不在。
我是否有任何关键点可以检查,哪些是成功所必需的 列为OLE COM对象?
PS:唯一的区别是类型库视图中指示的MSIL编译器版本:好的COM / DLL有MSIL 7.xxx坏的8.xxx 但我不知道在哪里选择MSIL编译器。 DLL / COM都是构建的 通过VS2013
答案 0 :(得分:0)
OLE / COM对象查看器显示注册。当应用程序尝试创建实例时,还涉及进一步的步骤:注册指向服务器实现,加载库,类工厂所在,调用类工厂以创建实例。这些步骤中的失败导致实例化失败,然而注册本身存在且有效。
解决问题的典型步骤是:
DllGetClassObject
导出的DLL函数中设置断点,最后在其DllMain
中 - 找出系统到达的接近程度创建一个实例。然后从那里开始,找到问题的根源。如果类甚至没有在OLE / COM对象查看器中列出,那么即使在注册阶段也存在问题。您的第一次故障排除尝试是手动重新注册,看看是否有任何注册错误,或者它是否解决了问题。注册失败的原因有很多,典型的是您的类型库中有COM类,但OBJECT_ENTRY
没有连接和引用的实现。失败的注册实例化预计无法正常工作,因为系统无法选择您的实现,并且您看到了所看到的内容:REGDB_E_CLASSNOTREG
错误代码。
答案 1 :(得分:0)
发现问题:类型库与对象没有关联,因为.rgs文件中的类型库CLSID与.idl文件中的类型库不同,只是通过一个最容易被引入的空间。
<。>在.rgs文件中:TypeLib = s '{7DAA7049 -AAB2-4689-8635-FB6E03423F34}'
in .idl
uuid(7DAA7049-AAB2-4689-8635-FB6E03423F34),
现在我可以在我的C#项目中将DLL用作COM。 COM / DLL未在对象树中列出,因为在.rgs文件中没有定义名称。这是一个带名称的定义,这是对象查看器中COM / DLL的名称;名称后跟s,之前是空的(s&#39;&#39;)。
ForceRemove {4763F309-D922-227A-A1A8-CDFF29893BBD} = s 'myDllCom Class'