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。有关此问题的更多信息,请使用错误代码作为搜索词在线搜索

4

8 回答 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 路径。

于 2011-01-05T22:04:51.433 回答
5

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

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

于 2010-12-28T23:14:20.357 回答
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 , a string] 失败的查询(例如 NAME_NOT_FOUND 错误),或对 HKEY_CLASSES_ROOT\CLSID\[a guid] 失败的查询。

PS:不幸的是,在一个完美运行的 Windows 系统上可能有很多事情似乎失败了,所以你必须仔细研究所有错误。祝你好运 :-)

于 2011-01-04T18:45:03.753 回答
1
于 2012-07-23T11:45:11.113 回答
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 的 system32 文件夹中:\windows 及其完成。之后我成功注册了我的 ocx。我在 windows server 2008 R2 64 位机器上使用了 32 位版本的chestysoft 工具 (dllregsvr.exe)。

于 2013-10-01T05:43:27.553 回答
0

如果您的 COM 对象使用 ATL,您可能需要安装 ATL,如本知识库文章所述:

http://support.microsoft.com/kb/201191

这些库可能必须由开发人员提供以确保正确的版本。

于 2010-12-28T23:33:26.713 回答
0

这是必须发生的事情。

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

然后在“运行”对话框中,输入: C:\Windows\SysWOW64\regsvr32.exe c:\windows\system32\YourDLL.dll

你会得到消息:

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

于 2012-10-29T01:42:17.643 回答
0

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

于 2015-06-02T18:48:09.307 回答