我使用ATL向导在Visual Studio 2008中创建了一个新的简单COM对象。该对象具有单个类和简单方法。 ATL向导确实为我的班级生成了.rgs
个文件。
当我在我的XP机器上运行regsvr32 Simple.dll
时,该类已注册,信息显示在HKCR\Simple.SimpleObject
和HKCR\CLSID\{guid}
中,正如我所料。
然而,在我的64位Windows 7机器上它并不相同。我以管理员身份运行regsvr32,显示HKCR\Simple.SimpleObject
中的部分。但是HKCR\CLSID
中的部分永远不会到达那里。因此我无法创建新实例。 (绝望的我已经在System32和SysWOW64中尝试了regsvr32,效果相同。)
为什么不regsrv32
将数据放入HKCR\CLSID
?
答案 0 :(得分:6)
HKCR是HKLM \ Software \ Classes的别名,但它并未显示所有内容。查看已注册的{guid}的HKLM \ Software \ Wow6432Node \ Classes \ CLSID。这是c:\ system32 \ syswow64 \ regsvr32.exe写入的地方。
你确实提到过你已经尝试过了。有一些问题,你不能随意运行任何版本的Regsvr32.exe并获得相同的DLL注册。无法在64位进程中加载32位DLL。换句话说,64位版本的Regsvr32.exe无法注册32位COM服务器。反过来说。为什么你没有收到错误消息是不可能从这里,只有理智的解释是你不知道实际上没有运行正确版本的Regsvr32。
要真正调试它,请使用SysInternals的ProcMon实用程序。它的跟踪向您展示了ATL注册商如何在注册表中编写密钥。
答案 1 :(得分:4)
32位应用程序和组件正被重定向到注册表的不同部分。如果您使用64位版本的regedit浏览注册表,则无法在您期望的位置找到它。
因此,您的组件应在HKEY_CLASSES_ROOT\Wow6432Node\CLSID
中注册。
在此注册表路径中,它应对所有32位应用程序可见。
另见:
答案 2 :(得分:1)
我们在这里遇到了类似的问题,Regsvr32没有报告错误,但似乎没有任何内容写入注册表。
运行'作为管理员'似乎可以解决问题。