COM DLL C++在对象查看器中不可见 我已经创建了一个带有Visual Studio 2013的COM接口的C++ DLL。 DLL get与注册一起安装。 在Ole对象查看器中,我可以看到此DLL的typelibrary以及所有 导出的函数。 regsvr32完成,没有任何错误

COM DLL C++在对象查看器中不可见 我已经创建了一个带有Visual Studio 2013的COM接口的C++ DLL。 DLL get与注册一起安装。 在Ole对象查看器中,我可以看到此DLL的typelibrary以及所有 导出的函数。 regsvr32完成,没有任何错误,dll,com,ole,clsid,Dll,Com,Ole,Clsid,就在C中,我无法使用,因为创建失败,出现错误0x80040154- 类未找到或未注册 这不是平台问题。64位版本在system32和32位版本中 syswow64中的版本,并在其中注册它们和类型库信息 在OLE对象查看器中确认这一点 但该类未列在OLE对象查看器树中 不知道遗漏了什么或错了什么 还有,我有一个simliar VC++项目,可以看到这个COM/DLL 在OLE对象查看器的视图中。它是编译的,链接的 并以完全相同的方式安装 我已经比较了所有编译器、链接器和MIDL设置,检查了.idl

就在C中,我无法使用,因为创建失败,出现错误0x80040154- 类未找到或未注册

这不是平台问题。64位版本在system32和32位版本中 syswow64中的版本,并在其中注册它们和类型库信息 在OLE对象查看器中确认这一点

但该类未列在OLE对象查看器树中

不知道遗漏了什么或错了什么

还有,我有一个simliar VC++项目,可以看到这个COM/DLL 在OLE对象查看器的视图中。它是编译的,链接的 并以完全相同的方式安装

我已经比较了所有编译器、链接器和MIDL设置,检查了.idl 项目中的文件,.rgs文件。。。一切似乎都一样,除了 不同的名称和guid

所以这真的很奇怪:一个在树中显示为COM对象 的OLE对象查看器,可以在C程序中使用,另一个不能

请注意:使用此DLL/COM的C项目中没有编译器错误。 创建0x80040154时出现运行时错误

小结:我要COM/DLL,这两个可视化学习项目,部署在同一个平台上 通过这种方式,一个可以在OLE对象树中看到,并且可以在C中使用,另一个则不能

是否有任何关键点我可以检查,哪些是成功的必要条件 作为OLE COM对象列出

PS:唯一的区别是类型库视图中指示的MSIL编译器版本:好的COM/DLL有MSIL 7.xxx,坏的有MSIL 8.xxx 但我根本不知道在哪里选择MSIL编译器。这两个DLL/COM都是构建的
通过VS2013,OLE/COM对象查看器显示注册。当应用程序尝试创建实例时,还需要进一步的步骤:注册指向服务器实现、加载库、定位类工厂、调用类工厂以创建实例。这些步骤中的失败会导致实例化失败,但注册本身存在且有效

解决问题的典型步骤包括:

在COM类的构造函数中,在类工厂构造中,在DLL的DllGetClassObject导出函数中,最后在其DllMain中设置断点,以了解系统在尝试创建实例时达到的程度。然后从这里开始,找到问题的根源。 使用Process Monitor跟踪实例化调用周围的注册表/文件活动,并确定其中存在的问题,特别是如果连COM服务器实现的DLL都没有加载。
如果该类甚至未在OLE/COM对象查看器中列出,则即使在注册阶段也存在问题。您的第一次故障排除尝试是手动重新注册,看看您是否有任何注册错误,或者它是否修复了问题。注册失败的原因有很多,一个典型的原因是您的类型库中有COM类,但是没有任何实现连接并被OBJECT_条目引用。由于系统无法启动您的实现,并且您看到了您所看到的:REGDB_E_CLASSNOTREG错误代码,注册失败,因此实例化预期无法工作。

发现了问题:typelibrary未与对象关联,因为.rgs文件中的typelibrary CLSID与.idl文件中的不同,就在一个最有可能被意外引入的空间旁

在.rgs文件中:

TypeLib = s '{7DAA7049 -AAB2-4689-8635-FB6E03423F34}'
in.idl

uuid(7DAA7049-AAB2-4689-8635-FB6E03423F34),
现在我可以在我的C项目中将DLL用作COM。 COM/DLL未列在对象树中,因为在.rgs文件中未定义名称。这是一个名为的定义,这是object viewer中COM/DLL的名称;该名称紧跟在s之后,以前是空的s

ForceRemove {4763F309-D922-227A-A1A8-CDFF29893BBD} = s 'myDllCom Class'

您好,我检查了使用regsvr32 dll的手动注册。我用管理员权限开始了这项工作,并在没有错误的情况下完成了。在对象查看器中仍然看不到该类。类型库已列出。My dll是CWinApp派生类,因此应该有一个入口点。当我实现DllMain时,我在编译时遇到一个错误。当实例化typelibrary公开的COM对象时,DllRegisterServer会在注册时调用,但不会在我的C项目中调用。在idl中,这个comobject由coclass mydllCom{[default]接口ImydllCom;}定义;注册DLL时会调用DllRegisterServer,它应该保留在OLE/COM对象浏览器中看到的注册条目。实例化时调用DllGetClassObject。据我所知,你在注册方面有问题。实例化预期会在之后失败。您需要先进行跟踪/步骤注册。您好,谢谢您的回答。对不起,是的,只注册一次。然而,我不知道该追踪什么,因为注册没有失败。DllRegisterServer返回ZE RO,无论是手动向regsvr32注册还是在InnoSetup部署中注册。我可以在OLE对象查看器中看到typelibrary,但没有作为COM对象列出。既然注册没有失败,如何跟踪进一步的错误?非常感谢。