2012-03-26 36 views
19

我们有一个编译为32位COM DLL和64位COM DLL(来自my earlier question的同一个DLL)的项目。当我在Windows 7机器上注册时,都注册成功。当我在Windows Server 2003机器上注册时,都注册成功。Server 2008上的32位DLL“可能不兼容”,但适用于Server 2003

但是当我尝试在Windows Server 2008 R2标准SP1机,64位DLL注册成功上注册的DLL,但32位 DLL失败消息(原文如此):

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

我不认为一个32位的DLL可以兼容WS2003和Win7而不是WS2008。这是没有意义的。

可能发生了什么?

+1

这可能是一个愚蠢的问题,但如果你有一个32位和64位版本的程序集,那你为什么要在64位操作系统上注册32位版本? – NotMe 2013-11-20 15:39:21

+5

这可能是一个比较愚蠢的问题,但为什么错误信息中有语法错误?这是否应该提示一些FU情况? – arsaKasra 2014-01-18 15:07:53

+2

回答第一个愚蠢的问题:质量保证。由于64位Windows支持32位DLL,我们必须确保我们的32位DLL在这种情况下工作。 – 2014-01-22 17:49:52

回答

13

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服务版本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 - 取消注册服务器 /我 - 调用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)

+2

regsvr32的64位版本可以委派给32位版本,用于(不)注册32位DLL,反之亦然。更可能的情况是WOW64根本没有安装。从Windows Server 2008 R2开始,WOW64现在是一个可选组件。 – 2012-03-26 20:57:56

+1

很高兴知道,谢谢! :) – nullforce 2012-03-26 21:03:27

+3

我们已经尝试过使用SysWOW64 \ regsvr32来注册32位DLL,并引发相同的错误。 – 2012-03-28 17:44:23

2

我通过将dll移动到c:\ windows \ syswow64 \目录(它不会在system32目录下工作),然后显式调用SysWow64资料\ REGSVR32,如

C:\ WINDOWS \ SysWow64资料\ REGSVR32 yourdll.dll

BTW调用C时,它不会工作: \ windows \ syswow64 \ regsvr32 c:\ windows \ syswow64 \ yourdll.dll

6

这不可能b é在你的情况下的问题,但可能对其他谁通过搜索相同的错误信息找到这个问题有用:

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

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

扫描模块列表中的CPU列确定了违规模块。 (在我的情况下,它说“没有找到DOS或PE签名,该文件不是有效的32位或64位Windows模块。”)

道德:依赖Walker可能会给你一个更有用的错误消息比RegSvr32.exe。

+0

这显示了我的问题的来源。我的路径是这样的64位DLL正在加载,而不是32位版本。 – Armbie 2017-07-06 22:54:00

1

我有同样的问题,但我的命令

CD \ WINDOWS \ SysWow64资料 REGSVR32Ç解决它:\文件名。 dll

0

使用来自SysInternals的Process Monitor

1。按“进程名称”= regsvr32.exe筛选。 Filter

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

3。进程监视器将跟踪在您的计算机上发生的所有事情。

4。首先通过消除注册表事件(现在)开始分析enter image description here

5。你可能会看到女巫的DLL找到并没有找到。

这里(非常)Threed32.ocx的REGSVR32.EXE的部分屏幕截图,其中我们可以看到一些所需的dll enter image description here

6。你的工作刚刚开始。现在起。

1

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

相关问题