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

将32位COM DLL注册到64位Windows 7,dll,windows-7,com,Dll,Windows 7,Com,我有一个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 hugina

我有一个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
并执行此命令。但我得到了错误。我能做什么?

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

将dll放入system32或syswow32目录,并使用适当的regsvr32进行注册。
我知道即使它给出了注册失败的错误,我还是重新启动了WIN 7 64,我的vb应用程序加载了dll,一切正常

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

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

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

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

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

  • 然后,您将在32位dll上执行32位regsvr(
    c:\windows\sysWOW64\regsvr.exe
    ),并尝试在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
      

    由于以下错误,检索CLSID为{…}的组件的COM类工厂失败:80040154类未注册(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG))

    如果你试试这个

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


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

    我相信,现在情况已经改变了。在我的Win 2008 R2框中,我可以用64位regsvr32注册一个32位dll,因为64位版本可以检测目标位并从%SYSWOW%文件夹生成一个新的32位regsvr32

    请参阅:

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

    下面的链接保存了这一天

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


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

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

    将.dll或.ocx复制到
    c:\windows\system32
    在运行菜单中键入cmd,它将搜索cmd.exe,右键单击并单击
    以管理员身份运行

    它将在
    c:\windows\system32

    类型

    regsvr32 ocxname.ocx
    to register.ocx


    键入
    regsvr32 dllname.dll
    以注册.dll

    +1。而且该DLL也不应该存储在c:\windows\system32中,这是用于64位组件的。对,因此名为32的文件实际上是64位的,32位版本位于名为WOW64的目录中。听起来更新版本的regsvr32可能更好地处理这个问题:这很奇怪。不清楚64位版本的regsvr32如何识别.dll是32位的。非常感谢您的回答!在注册一个64位.dll文件的过程中遇到了很多困难,并且使用了错误的命令
    C:\Windows\SysWOW64\regsvr32.exe。\my.dll
    而不是
    C:\Windows\System32\regsvr32.exe。\my.dll
    。此命令(regasm.exe)仅适用于.NET程序集。确定。我回答了关于的问题,重要的是你理解了这个级别。NET程序集如何
    regsvr32
    从一开始就一直在解决位性问题。如果使用64位的
    regsvr32
    注册32位DLL,后者会检测到问题,并在内部启动32位版本的
    regsvr32
    并在那里转发注册。这在相反的方向上也很有效。@RomanR:我本可以猜到,但看到这个问题和知识库文章support.microsoft.com/KB/282747,这让我想知道。+1你对以管理员身份运行的强调救了我的命!:)如果您不是以管理员身份运行,它会说安装成功,但不会注册。您不会收到任何其他反馈(dam you,Microsoft!)。IIS->池高级设置,启用32位应用程序:true这确实解决了问题+关于xp的0x8007000B错误,请参阅本文