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

32

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

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

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

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


关于0x8007000B错误,请查看此帖子:https://dev59.com/bWMl5IYBdhLWcg3w76oI#36353971 - JinSnow
10个回答

55

问题可能是您尝试使用64位版本的regsvr32注册32位库。请参见此KB文章 - 您需要从windows\SysWOW64运行regsvr32以注册32位库。


9
+1,确实如此。而且那个DLL不应该存储在c:\windows\system32目录下,因为那是为64位组件准备的。 - Hans Passant
2
对的,名为32的文件实际上是64位的,而32位版本在一个名为WOW64的目录中。 - aaa90210
好像更近期的 regsvr32 版本可以更好地处理这个问题:https://dev59.com/r2Mk5IYBdhLWcg3w0hI- - StayOnTarget
这很奇怪。不清楚64位的regsvr32如何识别.dll文件是32位的。 - sharptooth
1
非常感谢您的回答!我一直在苦苦挣扎如何正确注册一个64位的.dll文件,一直使用错误的命令C:\Windows\SysWOW64\regsvr32.exe .\my.dll,而应该使用C:\Windows\System32\regsvr32.exe .\my.dll - R13mus

30

对于在 Windows 64 位平台上的 32 位 DLLS:

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

在 CMD 窗口中:

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

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


3
你强调需要以管理员身份运行的点子救了我的命! :) - bluish
3
如果您不以管理员身份运行,则会显示安装成功,但不会注册。您将不会收到任何其他反馈(该死的微软!)。 - neves

4
我相信,现在情况已经改变了。在我的 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,则后者会检测到问题并启动内部的 32 位版本 regsvr32 并将注册转发到那里。反过来也同样适用。 - Roman R.
@RomanR.:我本来也会猜测,但看到这个SO问题和KB文章support.microsoft.com/kb/282747的支持,这让我感到困惑。 - Abhijit

2

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 < filename >.dll

您仍然可能遇到此异常。所以在 IIS 应用程序池的高级设置中,启用 32 位应用程序:true ;)


IIS -> 应用程序池高级设置,启用 32 位应用程序:true,这确实解决了问题。给它一个赞。 - Rolwin Crasta

2
要在 Windows 7 32 位上注册 comm .dll 或 .ocx,请按照以下步骤操作:
将 .dll 或 .ocx 复制到 c:\windows\system32。 在运行菜单中键入 cmd,它会搜索 cmd.exe,右键单击并点击 以管理员身份运行。 它会显示一个提示符号在 c:\windows\system32。 键入 regsvr32 ocxname.ocx 来注册 .ocx, 或者 键入 regsvr32 dllname.dll 来注册 .dll。

仅限于XP系统测试。 - raju chowrsiya

0

尝试在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程序集。 - justyy
好的。我回答了关于.NET程序集的问题,重要的是你理解它的级别。 - Dragon-Vo

0

0
将dll文件放入system32或syswow32目录中,并使用适当的regsvr32命令进行注册。 奇怪的是,尽管注册时出现了错误,但我重新启动了我的WIN 7 64位系统,我的vb应用程序仍然成功加载了该dll文件!

0

我在使用RegSvr32(32位和64位版本)时遇到了“该模块可能与此版本的Windows兼容”的错误。我试图在Server 2008 R2(x64)中注册一个为XP(32位)构建的DLL,但是Regsr32的解决方案都不适用于我。然而,在适当的.Net中注册程序集对我来说非常完美。

C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe


0

如果在使用 SysWoW64 版本的 regsvr32 时未解决问题,请确保所有库依赖项都具有相同的架构。例如,当 regsvr32 lib_x86.dll 无法注册库时,而 %SystemRoot%\SysWow64\regsvr32 lib_x86 也失败了,请尝试将 lib_x86 加载到 Dependency Walker 应用程序中以查看整个依赖项列表。如果任何项目具有 64 位架构,这就是为什么 regsvr32 无法加载 32 位库的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接