在 64 位机器上注册 C++ DLL

Posted

技术标签:

【中文标题】在 64 位机器上注册 C++ DLL【英文标题】:Registering C++ DLL on 64-bit machine 【发布时间】:2019-03-09 03:14:26 【问题描述】:

我编写的 C++ DLL 无法在 64 位计算机上注册。请注意 32 位机器上 DLL 寄存器的 32 位版本。

我们在发布模式下使用 Visual Studio 2010 在 64 位 Windows 7 计算机上构建 DLL,并以 x64 平台为目标。我想在 64 位 Windows 10 计算机(目标)上安装 DLL。目标计算机安装了 64 位的 VS 2010 redist。当我尝试使用以下方式注册程序时:

C:\windows\system32\regsvr32.exe

它失败并说程序“可能与您正在运行的此版本的 Windows 不兼容。检查该模块是否与 regsvr32 的 x86(32 位)或 x64(64 位)版本兼容.exe”。

我使用名为 Dependencies 的程序试图找出 DLL 需要哪些依赖项。依赖项说我的 DLL 需要 ATL100.dll。但是,这是由 VS 2010 redist 安装的,并且确实位于 C:\windows\system32 中。 DLL 本身不依赖任何第三方程序。

有没有人知道接下来要寻找什么来注册这个文件?

【问题讨论】:

也许 C:\windows\system32\regsvr32.exe 仅适用于 32 位 DLL。在我的 Win7 PC 上,C:\Windows\SysWOW64 中还有一个 regsvr32.exe。 这令人困惑,但我相信 system32 中的 regsvr32 用于 64 位应用程序,而 syswow64 中的 regsvr32 用于基于我看过的其他 *** 问题的 32 位应用程序。 注册控件,regsvr32.exe使用LoadLibrary加载你的DLL,调用GetProcAddress获取DLL的DllRegisterServer函数的地址,然后调用它。由 DLL 的 DllRegisterServer 实现来正确注册自己。如果 Dependencies 显示您的 DLL 具有没有其他字符的 DllRegisterServer 函数,那么您的 DLL 对该函数的实现可能不正确。 我会调查的,但是在 VS 2010 中针对 Win32 平台编译并在 32 位机器上注册的完全相同的代码可以正常工作。正因为如此,这让我觉得 64 位目标机器上缺少某些东西。 我使用depend.exe来检查依赖关系。如果缺少任何东西,它会突出显示它。依赖项做同样的事情吗?构建 DLL 时是否使用 .def 文件? 【参考方案1】:

我想通了。我不得不卸载 64 位和 32 位 VS 2010 redist 。从 C:\windows\system32 和 syswow64 目录中删除 ATL100.dll 并重新启动计算机。重新启动后,我重新安装了两个 redist 安装程序。然后我能够从管理命令提示符注册文件。

也许我们安装的东西安装了 ATL100.dll 文件,而当我安装 64 位 redist 时,它并没有覆盖 ATL100.dll。保留安装过时的版本。

【讨论】:

以上是关于在 64 位机器上注册 C++ DLL的主要内容,如果未能解决你的问题,请参考以下文章

Regsvr32 在64位机器上的用法(转载)

64位 regsrv win10_Regsvr32 在64位机器上的用法

64位 regsrv win10_Regsvr32 在64位机器上的用法

无法在其他机器上注册 C++ MFC dll

32 位 dll 参考在 64 位机器上没有失败

为啥我不能在 64 位机器上正确读取 HKCU 中的 32 位注册表值?