0

我已经使用 Visual Studio 2013 创建了一个带有 COM 接口的 c++ DLL。DLL get 与注册一起安装。在 Ole Object Viewer 中,我可以看到这个 DLL 的类型库以及所有导出的函数。regsvr32 完成,没有任何错误。

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

这不是平台问题。64 位版本在 system32 中,32 位版本在 syswow64 中,它们在那里注册,并且 OLE 对象查看器中的类型库信息证实了这一点。

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

Habe 不知道有什么遗漏或错误。

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

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

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

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

总结:我要COM/DLL,两个visual studion项目,部署方式相同,一个可以在OLE对象树中看到,可以在C#中使用,另一个不能。

有没有我可以检查的关键点以及成功列为 OLE COM 对象所需的关键点?

PS:唯一的区别是类型库视图中指示的 MSIL 编译器版本:好的 COM/DLL 有 MSIL 7.xxx 坏的 8.xxx 但我根本不知道选择的 MSIL 编译器在哪里。DLL/COM 均由 VS2013 构建

4

2 回答 2

0

OLE/COM 对象查看器显示注册。当应用程序尝试创建实例时,还涉及到进一步的步骤:注册指向服务器实现、加载库、定位类工厂、调用类工厂以创建实例。这些步骤中的失败会导致实例化失败,但注册本身是存在且有效的。

解决问题的典型步骤是:

  1. DllGetClassObject在您的 COM 类的构造函数中、在类工厂构造中、在DLL 的导出函数中设置断点,最后在它的DllMain- 以找出系统尝试创建实例的距离。然后从那里开始找到问题的根源。
  2. 使用进程监视器跟踪实例化调用周围的注册表/文件活动并识别那里的问题(尤其是如果您的带有 COM 服务器实现的 DLL 甚至没有加载)。

如果该类甚至没有在 OLE/COM 对象查看器中列出,那么即使在注册阶段也存在问题。您的第一次故障排除尝试是手动重新注册,看看您是否有任何注册错误,或者它是否解决了问题。注册失败的原因有很多,一个典型的原因是您的类型库中有 COM 类,但是没有连接和引用的实现OBJECT_ENTRY。注册失败的实例化预计无法正常工作,因为系统无法选择您的实现并且您会看到您所看到的:REGDB_E_CLASSNOTREG错误代码。

于 2015-05-13T16:34:40.703 回答
0

发现问题:typelibrary与object没有关联,因为.rgs文件中的typelibrary CLSID与.idl文件中的CLSID不同,只是一个空格,很可能是偶然引入的。

在 .rgs 文件中:

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

在.idl

uuid(7DAA7049-AAB2-4689-8635-FB6E03423F34),

现在我可以在我的 C# 项目中使用 DLL 作为 COM。COM/DLL 未在对象树中列出,因为在 .rgs 文件中未定义名称。这是一个带名称的定义,这是对象查看器中 COM/DLL 的名称;名称跟在 s 之后,之前为空 (s'')。

ForceRemove {4763F309-D922-227A-A1A8-CDFF29893BBD} = s 'myDllCom Class'
于 2015-05-13T23:20:00.750 回答