4

我使用 ATL 向导在 Visual Studio 2008 中创建了一个新的简单 COM 对象。该对象有一个单一的类和简单的方法。ATL 向导确实.rgs为我的班级生成了文件。

当我regsvr32 Simple.dll在我的 XP 机器上运行时,该类已注册,信息HKCR\Simple.SimpleObjectHKCR\CLSID\{guid}我预期的方式显示。

但是,在我的 64 位 Windows 7 机器上,情况就不一样了。我以管理员身份运行 regsvr32HKCR\Simple.SimpleObject显示的部分。但是其中的部分 HKCR\CLSID永远不会到达那里。因此我无法创建新实例。(绝望的我在 System32 和 SysWOW64 中都尝试了 regsvr32,效果相同。)

为什么不regsrv32把数据放进去 HKCR\CLSID

4

3 回答 3

7

HKCR 是 HKLM\Software\Classes 的别名,但它并不显示所有内容。在 HKLM\Software\Wow6432Node\Classes\CLSID 中查找已注册的 {guid}。这是 c:\system32\syswow64\regsvr32.exe 写入它们的位置。

你确实提到你已经尝试过了。这确实有问题,您不能任意运行任一版本的 Regsvr32.exe 并注册相同的 DLL。不能在 64 位进程中加载​​ 32 位 DLL。换句话说,64 位版本的 Regsvr32.exe 无法注册 32 位 COM 服务器。反之亦然。为什么您没有收到错误消息从这里无法猜测,唯一合理的解释是您实际上没有运行正确版本的 Regsvr32。

要真正调试它,请使用 SysInternals 的 ProcMon 实用程序。它的跟踪向您展示了 ATL 注册器如何在注册表中写入密钥。

于 2011-03-04T17:16:22.403 回答
4

32 位应用程序和组件被重定向到注册表的不同部分。如果您使用 64 位版本的 regedit 浏览注册表,您将不会在您期望的位置找到它。

因此,您的组件应在HKEY_CLASSES_ROOT\Wow6432Node\CLSID.

在此注册表路径中,它应该对所有 32 位应用程序可见。

也可以看看:

于 2011-03-04T16:13:37.463 回答
1

我们在这里遇到了类似的问题,Regsvr32 没有报告错误,但似乎没有任何内容写入注册表。

运行“以管理员身份”似乎可以解决问题。

于 2011-11-21T18:02:36.520 回答