在Windows Server 2008 R2上注册DLL文件

22

我正在尝试在Windows Server 2008 R2上注册一个COM DLL文件,以下是我采取的步骤:

  1. 以管理员身份运行 cmd
  2. c:\windows\system32\regsvr32.exe c:\tempdl\temp12.dll

当我执行该命令时,我收到以下错误信息:

模块temp12.dll加载失败。请确保二进制文件存储在指定的路径上或使用调试器检查二进制文件或相关.DLL文件是否存在问题。指定的模块无法找到。

我能够在Windows 2000上注册相同的DLL文件。

我还尝试过

c:\windows\syswow64\regsvr32 "c:\tempdl\temp12.dll"

我遇到了这个错误:

模块 c:\tempdl\temp12.dll 已加载,但调用 DllRegisterServer 失败,错误代码为 0x80040154。如需更多有关此问题的信息,请使用错误代码作为搜索条件在线搜索。


如果您想将所有相关的DLL放在Dropbox中,我很乐意为您调查此事。 - Kev
@kev 谢谢你的提议,Kev。但是我已经解决了。 - Broken Link
8个回答

26

当 DLL 本身需要先注册另一个 COM 服务器或依赖于另一个不可用的 DLL 时,您会收到此错误。Regsvr32.exe 工具几乎没做什么事情,它调用 LoadLibrary() 来加载在命令行参数中传递的 DLL,然后使用 GetProcAddress() 在 DLL 中查找 DllRegisterServer() 入口点,并调用它使 COM 服务器自行注册。

那段代码到底在做什么是相当难以猜测的。但是,您得到的诊断信息非常明显,由于某个原因,这个 COM 服务器需要先注册另一个服务器。错误消息很差劲,它没有告诉您需要注册哪个其他服务器。这是 COM 错误处理方式带来的悲哀副作用。

要排除此问题,请使用 SysInternals 的 ProcMon 工具。它会显示 Regsvr32.exe(实际上是 COM 服务器)打开的注册表键,以查找服务器。查找访问 CLSID 键。这给出了它正在寻找的 {guid} 的提示。这仍然不能完全告诉您服务器 DLL,您应该将跟踪结果与有效机器获得的结果进行比较。InprocServer32 键包含 DLL 路径。


我是一个普通用户,试图调试一个程序,但它的作者不回答我的问题。我已经下载了进程监视器,但我不知道如何按照你最后一段的指示操作。你能简单地向我解释一下如何解决这个问题吗? - Ooker

5

您可能需要使用32位版本的regsvr32.exe注册此DLL:

c:\windows\syswow64\regsvr32 c:\tempdl\temp12.dll


请注意,以上内容为计算机技术相关内容,仅供参考。

1
我也尝试过,并且出现了以下错误:"模块 c:\tempdl\temp12.dll 已加载,但调用 DllRegisterServer 失败,错误代码为 0x80040154。有关此问题的更多信息,请使用错误代码作为搜索词在线搜索。" - Broken Link
你是在使用提升权限的命令提示符执行此操作吗? - vcsjones
2
当DLL本身需要先注册另一个COM服务器时,就会出现这个错误。很难猜到需要注册哪个DLL,可以使用SysInternals的ProcMon工具,在注册表中查找CLSID键值。与正常工作的计算机进行比较以获取跟踪结果。 - Hans Passant
1
关于答案本身,至少在Win7上,regsvr32足够聪明,如果DLL的位数不匹配就会调用其它版本的自身,所以你不必担心这个问题。(除非在其他操作系统版本上有所不同。) - Leo Davidson
@Leo - 我知道这个(在Windows 2008R2上可以),但有时候你永远不知道 :) - Kev
显示剩余4条评论

4

错误代码0x80040154是COM的REGDB_E_CLASSNOTREG,意思是“类未注册”。基本上,安装注册表中没有声明COM类。

如果您在尝试注册DLL时遇到此错误,可能是该DLL的注册代码正在尝试实例化另一个缺失或未在此安装中注册的COM服务器(DLL或EXE)。

如果您无法访问原始DLL源代码,建议使用SysInternal的Process Monitor工具来跟踪COM注册表查找(以前有一个更简单的RegMon工具,但可能不再起作用)。

您应该对工作进程(这里是Regsvr32.exe)设置过滤器,以仅捕获有趣的内容。然后,您应该寻找在HKEY_CLASSES_ROOT \ [a progid,字符串]上失败的查询(例如NAME_NOT_FOUND错误),或者在HKEY_CLASSES_ROOT \ CLSID \ [a guid] 上失败的查询。

PS:不幸的是,在完全正常的Windows系统上可能会出现许多看似失败的事情,因此您必须仔细研究所有错误。祝你好运:-)


1

1
我在将我的ActiveX(OCX)注册到Windows Server 2008 R2时遇到了类似的问题。为了解决这个问题,我使用了http://www.chestysoft.com/dllregsvr/default.asp工具。由于我的ocx存在依赖问题,所以我收到了“模块temp12.dll无法加载。请确保二进制文件存储在指定路径或调试它以检查二进制文件或相关.DLL文件的问题。指定的模块无法找到”错误消息。 当您尝试使用此工具注册您的OCX时,如果OCX具有依赖关系,它将提示消息,否则您将获得成功消息。我收到了mfc70.dll和msvcr70.dll依赖关系的消息,因此我将这些dll粘贴到C:\ windows的system32文件夹中,然后完成注册。我在Windows Server 2008 R2 64位机器上使用32位版本的chestysoft工具(dllregsvr.exe)。

0

你需要 regsvr32 的完整路径,因此是 %windir$\system32\regsvr32 <*.dll>


0

我在C:\Windows\SysWOW64\和C:\Windows\System32中都有atl.dll,我还需要按照那篇文章所说的做吗? - Broken Link
我正在尝试在2008年注册的dll是在2000年构建的,而且我甚至不知道我们是否有源代码。 - Broken Link

0

需要执行以下操作:

您必须将要注册的DLL文件复制到: c:\windows\SysWOW64\

然后在运行对话框中,键入以下内容: C:\Windows\SysWOW64\regsvr32.exe c:\windows\system32\YourDLL.dll

然后您将收到以下消息:

c:\windows\system32\YourDLL.dll的DllRegisterServer成功。


这对我们起作用了 - 我们把dll放错文件夹了,当我们把它放到SysWOW64中时,它没有问题地注册了。谢谢! - Vidar
1
这可能对你有用,但你真的不应该将自己的DLL文件复制到系统文件夹中。 - njplumridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接