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 驱动程序不可用
Windows Server2008 R2安装wampserver缺少api-ms-win-crt-runtime-l1-1-0.dll解决方案