将 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的主要内容,如果未能解决你的问题,请参考以下文章
无法在 32 位机器上注册使用 VS2012/VC++ 构建的 COM DLL
求助,本人win10 64位,现在要注册oraoledb12.dll注册表。按照说明将dll文件