将 32 位 COM DLL 注册到 64 位 Windows 7

Posted

技术标签:

【中文标题】将 32 位 COM DLL 注册到 64 位 Windows 7【英文标题】:Register 32 bit COM DLL to 64 bit Windows 7 【发布时间】:2011-03-27 06:33:37 【问题描述】:

我有一个 32 位 COM 组件 DLL,这个 DLL 是用 Delphi 编写的。 它是一个 Win32 DLL。 我想在 .NET 平台上的 Visual C# 项目中使用这个 DLL。

我无法在项目中添加对此 DLL 的引用。 我尝试在 Windows 7 64 位中以管理员身份在命令提示符中注册它,但出现此错误:

检查模块是否与 regsvr32.exe 的 x86(32 位)或 x64(64 位)版本兼容。

首先我将 DLL 文件放到 windows/system32 文件夹中。然后我以管理员身份打开命令提示符。我写regsvr32 huginalpha.dll 并执行这个命令。但我得到了错误。我该怎么办?

【问题讨论】:

查看这篇关于 0x8007000B 错误***.com/questions/18007967/…的帖子 【参考方案1】:

问题可能是您尝试使用 64 位版本的 regsvr32 注册 32 位库。 See this KB article - 对于 32 位库,您需要从 windows\SysWOW64 运行 regsvr32。

【讨论】:

+1,确实如此。并且该 DLL 也不应存储在 c:\windows\system32 中,这是针对 64 位组件的。 对了,所以叫32的文件其实是64位的,32位的版本在一个叫WOW64的目录下。 听起来 regsvr32 的最新版本可能会更好地处理这个问题:***.com/questions/18935163/… 这很好奇。目前尚不清楚 regsvr32 的 64 位版本如何识别 .dll 是 32 位的。 非常感谢您的回答!正在努力注册正确的 64 位 .dll 文件,并且使用了错误的命令 C:\Windows\SysWOW64\regsvr32.exe .\my.dll 而不是使用 C:\Windows\System32\regsvr32.exe .\my.dll【参考方案2】:

对于 Windows 64 位平台中的 32 位 DLLS:

    将whatever.dll复制到c:\windows\sysWOW64\ 以管理员身份打开 CMD 提示符(非常重要)

在 CMD 窗口中:

    CD c:\windows\sysWOW64\ regsvr32 whatever.dll

然后您将在 32 位 dll 上执行 32 位 regsvr (c:\windows\sysWOW64\regsvr.exe)

【讨论】:

+1 您强调以管理员身份运行这一点救了我的命! :) 如果不以管理员身份运行会说安装成功,但不会注册。您将不会收到任何其他反馈(该死,微软!)。【参考方案3】:

我相信,现在情况发生了变化。在我的 Win 2008 R2 盒子上,我能够使用 64 位 regsvr32 注册一个 32 位 dll,因为 64 位版本可以检测目标位数并从 %SYSWOW% 文件夹生成一个新的 32 位 regsvr32 .

参考:Registering a 32 bit DLL with 64 bit regsvr32

【讨论】:

regsvr32 长期以来一直在解决位数问题,我想从一开始就是这样。如果您使用 64 位 regsvr32 注册一个 32 位 DLL,后者会检测到问题并在内部启动 regsvr32 的 32 位版本并在那里转发注册。这也适用于相反的方向。 @RomanR.:我已经猜到了,但是看到这个 SO 问题和知识库文章 support.microsoft.com/kb/282747,这会让我感到奇怪。【参考方案4】:

http://onerkaya.blogspot.com/2013/03/register-com-dll-on-windows-64-bit.html

检索具有 CLSID ... 的组件的 COM 类工厂失败,原因是以下错误:80040154 未注册类(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))。

如果你试试这个;

c:\windows\system32\regsvr32.exe .dll

你仍然可以接受这个例外。所以 IIS-pool 高级设置,启用 32 位应用程序:true ;)

【讨论】:

IIS-> pool Advanced settings, Enable 32 bit application : true 这确实解决了问题。为它 +1。【参考方案5】:

要在 Windows 7 32 位上注册 comm .dll 或 .ocx,请执行以下操作:

将 .dll 或 .ocx 复制到 c:\windows\system32 在运行菜单中输入cmd,会搜索cmd.exe,右键点击Run as Administrator

它会在c:\windows\system32显示一个提示

键入

regsvr32 ocxname.ocx注册.ocx

输入regsvr32 dllname.dll注册.dll

【讨论】:

对于 xp 也经过测试【参考方案6】:

把dll放到system32或者syswow32目录下,用合适的regsvr32注册。 奇怪的是,即使它给出了无法注册的错误,我重新启动了我的 WIN 7 64 并且我的 vb 应用程序加载了 dll 就好了!!

【讨论】:

【参考方案7】:

如果问题没有解决,在使用 SysWoW64 版本的 regsvr32 时,请确保所有库依赖项具有相同的架构。例如,当

regsvr32 lib_x86.dll 注册库失败,并且 %SystemRoot%\SysWow64\regsvr32 lib_x86 也失败了,尝试将 lib_x86 加载到 Dependency Walker 应用程序以查看整个依赖项列表。如果任何项目具有 64 位架构,这就是为什么 regsvr32 无法加载 32 位库的原因。

【讨论】:

【参考方案8】:

尝试在 Framework64 上运行它。

例子:

32 位

C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe D:\DemoIconOverlaySln\Demo\bin\Debug\HandleOverlayWarning\AsmOverlayIconWarning.dll /codebase 

64 位

C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe D:\DemoIconOverlaySln\Demo\bin\Debug\HandleOverlayWarning\AsmOverlayIconWarning.dll /codebase

【讨论】:

这个 (regasm.exe) 仅适用于 .NET 程序集。 好的。我回答了这个问题,重要的是你了解水平。 NET 程序集如何【参考方案9】:

对于 RegSvr32 的两个版本(32 位和 64 位),我都收到错误“模块可能与此版本的 windows 兼容”。我试图在 Server 2008 R2 (x64) 中注册一个为 XP(32 位)构建的 DLL,但没有一个 Regsr32 分辨率对我有用。但是,在适当的 .Net 中注册程序集对我来说是完美的。 C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe

【讨论】:

【参考方案10】:

下面的链接保存了一天

https://msdn.microsoft.com/en-us/library/ms229076(VS.80).aspx

使用上述链接中指定的相关 RegSvcs

c:\Windows\Microsoft。 NET\Framework\v4.0.30319\RegSvcs.exe ....\Shared\Your.dll /tlb:Your.tlb

【讨论】:

以上是关于将 32 位 COM DLL 注册到 64 位 Windows 7的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 从 32 位进程访问 64 位 dll

无法在 32 位机器上注册使用 VS2012/VC++ 构建的 COM DLL

求助,本人win10 64位,现在要注册oraoledb12.dll注册表。按照说明将dll文件

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

从系统(SysWOW64)目录外部注册 32 位 COM 时出现问题

通过 COM 在 64 位进程中使用 32 位 DLL