Server 2008上的32位DLL"可能不兼容",但适用于Server 2003

Nul*_*tc. 20 32bit-64bit windows-server-2008-r2

我们有一个项目,编译为32位COM DLL和64位COM DLL(与我之前的问题相同).当我在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.这是没有意义的.

可能会发生什么?

nul*_*rce 14

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安装在系统(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 - 取消注册server/i - 调用DllInstall传递一个可选的[cmdline]; 与/ u一起使用时调用dll uninstall/n - 不要调用DllRegisterServer; 此选项必须与/ i/s一起使用 - 无声; 不显示消息框(随Windows XP和Windows Vista一起添加)使用Regsvr32.exe时,它会尝试加载组件并调用其DLLSelfRegister函数.如果此尝试成功,Regsvr32.exe将显示一个指示成功的对话框.如果尝试失败,Regsvr32.exe将返回错误消息.这可能包括Win32错误代码.有关更多信息,请单击下面的文章编号,以查看Microsoft知识库中相应的文章:193625 WinInet错误代码(12001到12156)

  • 我们已经尝试使用SysWOW64\regsvr32来注册32位DLL,这会带来同样的错误. (4认同)
  • 64位版本的regsvr32可以委托32位版本(un)注册32位DLL,反之亦然.更有可能的是WOW64根本没有安装.从Windows Server 2008 R2开始,WOW64现在是一个可选组件. (3认同)

小智 6

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

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

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

扫描模块列表中的CPU列可识别出有问题的模块.(在我的例子中,它说"没有找到DOS或PE签名.这个文件不是有效的32位或64位Windows模块.")

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