2012-07-11 132 views
3

我有一个最初为x86构建的C++ ATL COM DLL,由x86构建的.NET 4.0应用程序正在使用DLL,一切正常。无法正确注册Windows 7上的x64 COM DLL x64

在为x64重新编译COM dll后,使用c:\windows\system32\regsvr32(un-reg x86 dll)注册后,我无法在Visual Studio添加引用窗口中看到COM DLL,我导出了注册表项HKCR和HKLM \ Softwares与x64和然后x86版本的DLL注册,并没有键丢失,各自的键指向正确的DLL位置。

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

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {00000000-0000-0000-0000-A797AD238051} failed due to the followi ng error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASS NOTREG)). at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolea n noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurity Check) at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boo lean fillCache) at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibil ityChecks, Boolean skipCheckThis, Boolean fillCache) at System.Activator.CreateInstance(Type type, Boolean nonPublic)

我已经花了大量的时间在网上搜索,但没有发现任何远程关闭,没有人见过这样的事,或任何调试工具我也许可以使用?

我不拥有dll,拥有它的人可以看到曾经在机器上构建过的x64 dll,但在其他两台机器上尝试过,并且两者都无法工作。

+1

没有看到对话框中的组件是完全正常的,VS是一个32位的进程,所以只能看到32位的COM服务器。不要取消注册您的x86版本。我无法跟随其余的。 – 2012-07-11 23:57:45

+0

x64的挑战之一是[注册表重定向器](http://msdn.microsoft.com/en-us/library/windows/desktop/aa384232(v = vs.85))。aspx)这有助于 - 有时太多。有可能一个注册是践踏另一个。 SysInternals [ProcMon](http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)是很多情况下的好工具。在重现问题的同时监视注册表,您可以看到真正正在读取的注册表项。 – 2012-07-12 04:05:55

+1

我也建议你通过将InteropServices从图片中解放出来来简化事情。使用C++构建简单的32位和64位测试客户端。在尝试从托管代码调用COM对象之前先让那些工作正常。 – 2012-07-12 04:07:59

回答

0

这个问题很旧,我需要更多的信息才能完全排除故障。但是,我可能会为在同一问题上运行的任何人提供一些提示。

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

检查特定类型库注册方式的一种方式是oleview工具。相同的信息在注册表中,但此工具可能稍微友好一点。该工具应位于Visual Studio命令提示符处设置的路径中。这听起来像误差约为一个给定的GUID,您可以从Object类检查类 - >树中的所有对象:

Finding a class in the tree

如果你碰巧有类(你可以有要重新注册要检查的x86版本),可以通过展开刚刚找到的GUID条目来查找类实现的COM接口的信息。如果有类型库,应该这样说。注意,这里既可以是win32win64条目的类型库信息的路径:

Example of interface with both win32 and win64 paths

没有进一步的信息,也很难说,但我猜的东西是错误的自注册和/或为x64键入类型库。顺便说一下,对于您计划发布的库,您可能不会依赖自行注册 - 安装程序包可以并且应该自己创建注册表项。如果你有更多的信息,我可以尝试提供更多细节。

相关问题