无法在Windows 7 x64上正确注册x64 COM dll

时间:2012-07-11 23:00:50

标签: c# .net visual-studio visual-c++ com

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

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

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

  

System.Runtime.InteropServices.COMException(0x80040154):正在检索   具有CLSID的组件的COM类工厂   {00000000-0000-0000-0000-A797AD238051}由于以下原因而失败   错误:80040154未注册类(HRESULT异常:   0x80040154(REGDB_E_CLASS NOTREG))。在   System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值   publicOnly,Boolea n noCheck,Boolean&amp; canBeCached,   RuntimeMethodHandleInternal&安培; ctor,布尔&amp; 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)在System.Activator.CreateInstance(Type type,Boolean   非公开)

我花了相当多的时间在线搜索,但是没有找到任何远程关闭的东西,有人看过这样的东西,或者我可能使用的任何调试工具?

我没有拥有dll的方式,拥有它的人,可以看到一旦在机器上构建了x64 dll,但是已经尝试了其他2台机器,并且它对任何一台机器都不起作用。 / p>

1 个答案:

答案 0 :(得分:0)

这个问题已经过时了,我需要更多信息才能完全排除故障。但是,我可以为遇到同一问题的任何人提供一些提示。

鉴于您使用的是regsvr32,DLL正在使用名为self-registration的内容。这意味着DLL在名为DllRegisterServer的导出函数中处理自己对Windows注册表的添加。正如您似乎发现的那样,注册表项在x86和x64之间有所不同,但这不一定是您的核心问题。您可以(通常应该)同时注册x86和x64类型的库。

检查特定类型库的注册方式的一种方法是oleview工具。注册表中的信息相同,但此工具可能更友好一些。该工具应位于Visual Studio命令提示符下设置的路径中。听起来这个错误是关于具有给定GUID的类,您可以从对象类检查 - &gt;树中的所有对象:

Finding a class in the tree

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

Example of interface with both win32 and win64 paths

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