32位DLL在Server 2008上“可能不兼容”,但在Server 2003上可以使用

问题描述 投票:20回答:6

我们有一个项目可以编译为32位COM DLL和64位COM DLL(与my earlier question中的相同)。当我在Windows 7计算机上都注册时,两个都成功注册。当我在Windows Server 2003计算机上都注册时,两个都成功注册。

但是当我尝试在Windows Server 2008 R2标准SP1计算机上注册DLL时,成功注册了64位DLL,但是32位 DLL失败,并显示以下消息:

模块“%1””可能与您正在运行的Windows版本不兼容。检查模块是否与regsvr32.exe的x86(32位)或x64(64位)版本兼容。

我认为32位DLL不能与WS2003和Win7兼容,但不能与WS2008兼容。那没有道理。

可能会发生什么?

32bit-64bit windows-server-2008-r2
6个回答
14
投票

Regsvr32.exe的版本必须与您要注册的dll的32位/ 64位匹配。 64位regsvr32无法加载32位dll,反之亦然。

您可能需要显式调用%systemroot%\ SysWoW64 \ regsvr32.exe中的regsrv32的32位版本。

来自http://support.microsoft.com/kb/249873

Regsvr32.exe包含在Microsoft Internet Explorer 3.0或更高版本,Windows 95 OEM Service Release 2(OSR2)或更高版本以及Windows NT 4.0 Service Pack 5(SP5)或更高版本中。 Regsvr32.exe安装在系统(Windows Me / Windows 98 / Windows 95)或System32(Windows NT / Windows XP / Windows Vista / Windows 7)文件夹中。

注意:在Windows操作系统的64位版本上,有两个版本的Regsv32.exe文件:

  • 64位版本为%systemroot%\ System32 \ regsvr32.exe。
  • 32位版本是%systemroot%\ SysWoW64 \ regsvr32.exe。

Regsvr32.exe的用法RegSvr32.exe具有以下命令行选项:Regsvr32 [/ u] [/ n] [/ i [:cmdline]] dllname

/ u-取消注册服务器/ i-调用DllInstall,并为其传递可选的[cmdline];与/ u一起使用时调用dll卸载/ n-不调用DllRegisterServer;此选项必须与/ i一起使用/ s –静音;不显示消息框(Windows XP和Windows Vista中已添加)当您使用Regsvr32.exe时,它将尝试加载该组件并调用其DLLSelfRegister函数。如果此尝试成功,Regsvr32.exe将显示一个对话框,指示成功。如果尝试失败,则Regsvr32.exe返回错误消息。这可能包括Win32错误代码。有关更多信息,请单击下面的文章编号,以查看Microsoft知识库中相应的文章:193625 WinInet错误代码(12001至12156)


6
投票

在您的情况下,这可能不是问题,但对通过搜索同一条错误消息来查找此问题的其他人可能有用:

我有一个类似的问题:一个不会向RegSvr32的32位或64位版本注册的DLL。我将DLL加载为Dependency Walker(depends.exe,http://www.dependencywalker.com/),并得到了更有用的消息:

错误:至少一个文件不是32位或64位Windows模块。

扫描“模块列表”中的CPU列已确定有问题的模块。 (对于我来说,它说“找不到DOS或PE签名。此文件不是有效的32位或64位Windows模块。”)

道德:依赖行者可能会给您比RegSvr32.exe更有用的错误消息。


3
投票

我通过将dll移至c:\ windows \ syswow64 \目录(在system32目录中不起作用)然后显式调用syswow64 \ regsvr32进行了注册,例如

c:\ windows \ syswow64 \ regsvr32 yourdll.dll

btw调用c:\ windows \ syswow64 \ regsvr32 c:\ windows \ syswow64 \ yourdll.dll时不起作用


1
投票

我有同样的问题,但是我可以通过命令解决它

CD \ windows \ syswow64regsvr32 c:\文件名。 dll


1
投票

以管理员身份运行命令提示符已解决我的问题。


1
投票

使用SysInternals中的Process Monitor

1。通过“进程名称” = regsvr32.exe进行过滤。

“筛选器”

2。尝试从regsvr32.exe的正确版本(32位版本在SysWow64文件夹中)注册DLL文件。

3。

Process Monitor将跟踪计算机上发生的所有事情。

4。

首先,通过消除注册表事件开始分析(现在):

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9VdUVtSS5wbmcifQ==” alt =“在此处输入图像描述”>

5。

您也许可以查看找到和找不到哪个DLL文件。

[这是Threed32.ocx的regsvr32.exe的(非常)部分屏幕截图,在这里我们可以看到一些所需的DLL文件:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9jbngyYS5wbmcifQ==” alt =“在此处输入图像描述”>

6。

您的工作才刚刚开始。从现在开始。
© www.soinside.com 2019 - 2024. All rights reserved.