32 位 DLL 在 Server 2008 上“可能不兼容”,但在 Server 2003 上有效

Posted

技术标签:

【中文标题】32 位 DLL 在 Server 2008 上“可能不兼容”,但在 Server 2003 上有效【英文标题】:32-bit DLL "may not compatible" on Server 2008, but works on Server 2003 【发布时间】:2012-04-10 09:17:20 【问题描述】:

我们有一个项目可以编译为 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 兼容。这没有任何意义。

可能会发生什么?

【问题讨论】:

这可能是一个愚蠢的问题,但如果你的程序集有 32 位和 64 位版本,那你为什么要在 64 位操作系统上注册 32 位版本? 这可能是一个更愚蠢的问题,但为什么错误消息中有语法错误?这是否应该暗示手头有一些 FU 情况? 回答第一个愚蠢的问题:质量保证。由于 64 位 Windows 支持 32 位 DLL,我们必须确保我们的 32 位 DLL 在这种情况下工作。 回答第二个愚蠢的问题:细微的语法错误在于消息本身。即使消息实际上说“可能不兼容”,读者也可能会读到“可能不兼容”。毕竟,这并不像臭名昭著的“你所有的基地都属于我们”那样明显糟糕。 【参考方案1】:

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

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

来自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 安装在 System (Windows Me/Windows 98/Windows 95) 或 System32 (Windows NT/Windows XP/Windows Vista/Windows 7) 文件夹中。

注意在 64 位版本的 Windows 操作系统上,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)

【讨论】:

regsvr32 的 64 位版本可以委托给 32 位版本来(取消)注册 32 位 DLL,反之亦然。更有可能的情况是根本没有安装WOW64。从 Windows Server 2008 R2 开始,WOW64 现在是一个可选组件。 我们已经尝试使用 SysWOW64\regsvr32 来注册 32 位 DLL,但也出现了同样的错误。【参考方案2】:

这可能不是您的问题,但对于通过搜索相同错误消息找到此问题的其他人可能有用:

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

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

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

道德:Dependency Walker 可能会为您提供比 RegSvr32.exe 更有用的错误消息。

【讨论】:

这向我展示了问题的根源。我的路径是加载 64 位 dll 而不是 32 位版本。【参考方案3】:

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

c:\windows\syswow64\regsvr32 yourdll.dll

顺便说一句,调用 c:\windows\syswow64\regsvr32 c:\windows\syswow64\yourdll.dll 时它不起作用

【讨论】:

【参考方案4】:

我有同样的问题,但我用命令解决了它

光盘\windows\syswow64 regsvr32 c:\文件名。 dll

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

使用来自 SysInternals 的 Process Monitor。

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

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

3. Process Monitor 将跟踪您计算机上发生的一切。

4.首先通过消除注册表事件(暂时)开始您的分析:

5. 您可以查看找到和未找到的 DLL 文件。

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

6.你的工作才刚刚开始。从现在开始。

【讨论】:

以上是关于32 位 DLL 在 Server 2008 上“可能不兼容”,但在 Server 2003 上有效的主要内容,如果未能解决你的问题,请参考以下文章

Windows Server 2008 R2 标准版 SP2 64位中文如何安装openssl 组件

64 位 windows server 2008 中的 32 位 informix 驱动程序不可用

SQL Server 2008 集成安全性

Windows Server2008 R2安装wampserver缺少api-ms-win-crt-runtime-l1-1-0.dll解决方案

64位系统注冊32位的directshow filter文件

windows server2012R2 64位系统中安装SQL server2008 32位最大使用内存是多少?