3

我有一个最初为 x86 构建的 C++ ATL COM DLL,为 x86 构建的 .NET 4.0 应用程序正在使用 dll,一切正常。

为 x64 重新编译 COM dll,然后使用注册它c:\windows\system32\regsvr32(在取消注册 x86 dll 之后),我无法在 Visual Studio 添加引用窗口中看到 COM DLL,我导出了 HKCR 和 HKLM\Softwares 的注册密钥使用 x64 和 x86 版本的 dll 注册,并且没有丢失任何键,相应的键都指向正确的 dll 位置。

此外,在注册 x64 dll 后,我可以通过导航到文件所在的文件夹并选择它来添加对 dll 的引用,但它仍然无法执行(.net 程序集设置为 x64)并出现以下错误

System.Runtime.InteropServices.COMException (0x80040154):检索具有 CLSID {00000000-0000-0000-0000-A797AD238051} 的组件的 COM 类工厂失败,原因是以下错误:80040154 未注册类(来自 HRESULT 的异常:0x80040154( REGDB_E_CLASS NOTREG))。在 System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型,Boolean publicOnly,Boolea n noCheck,Boolean& canBeCached,RuntimeMethodHandleInternal& ctor,Boolean& bNeedSecurity Check)在 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean skipCheckThis,Boolean fillCache)在 System.RuntimeType.CreateInstanceDefaultCtor (布尔 publicOnly,布尔 skipVisibilityChecks,布尔 skipCheckThis,布尔 fillCache)在 System.Activator.CreateInstance(类型类型,布尔非公共)

我花了相当多的时间在网上搜索,但没有找到任何远程接近的东西,有人见过这样的东西,或者我可以使用的任何调试工具?

顺便说一句,我不拥有 dll,拥有它的人可以在机器上看到 x64 dll,但在其他 2 台机器上尝试过,但在任何一台机器上都不起作用。

4

1 回答 1

0

这个问题很老,我需要更多信息才能完全排除故障。但是,我也许可以为遇到相同问题的任何人提供一些提示。

鉴于您正在使用regsvr32DLL,因此 DLL 正在使用一种称为self-registration的东西。这意味着 DLL 正在一个名为DllRegisterServer的导出函数中处理它自己对 Windows 注册表的添加。正如您似乎已经发现的那样,x86 和 x64 之间的注册表项不同,但这不一定是您的核心问题。您可以而且通常应该同时注册 x86 和 x64 类型库。

检查特定类型库如何注册的一种方法是oleview工具。相同的信息在注册表中,但这个工具可以更友好一些。该工具应位于 Visual Studio 命令提示符设置的路径中。听起来错误与具有给定 GUID 的类有关,您可以从树中的 Object Classes -> All Objects 中进行检查:

在树中找到一个类

如果您碰巧拥有该类(您可能必须重新注册 x86 版本才能检查),您可以通过扩展您刚刚找到的 GUID 的条目来找到有关该类实现的 COM 接口的信息。如果有类型库,应该这样说。请注意, TypeLib 信息中的路径可以同时存在win32和条目:win64

带有 win32 和 win64 路径的接口示例

如果没有更多信息,很难说,但我猜想 x64 的自注册和/或类型库有问题。顺便说一句,对于您计划发布的库,您可能无论如何都不依赖自注册——安装程序包可以而且应该自己创建注册表项。如果您确实有更多信息,我可以尝试提供更多细节。

于 2014-09-01T18:59:06.017 回答