为什么我的DLL无法注册?

时间:2009-10-15 05:07:31

标签: c++ com dll registry

我正在VS2005中构建一个项目,我的几个DLL都无法注册。我在Visual Studio中收到的错误消息是:

  

项目:错误PRJ0019:工具从“注册ActiveX控件...”

返回错误代码

这很模糊。当我通过命令行手动注册DLL时(使用regsv32.exe,我收到以下错误:

  

LoadLibrary(“test.ocx”)失败 - 此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决问题。

我在罪魁祸首.ocx文件上运行了Dependency Walker(depends.exe),但它没有显示任何明显的问题。

我也做了重建,但我仍然遇到同样的问题。

有关如何确定注册失败原因的任何建议?

5 个答案:

答案 0 :(得分:3)

最有可能是因为嵌入式清单。您应该使用资源浏览器应用程序并检查您的DLL以获取嵌入的清单。可能是其中一个依赖DLL(或您的DLL)需要某些版本的其他不存在的DLL。

我收到此消息:“此应用程序无法启动,因为应用程序配置不正确。”如果嵌入了明显的错误匹配。

答案 1 :(得分:3)

微软最近发布了ATL安全更新(KB971090)。它是在MSVS2005sp1之上更新的,它既是compilate-time又是运行时兼容性的破坏者。检查您的建筑环境是否有此补丁。

参考文献:

答案 2 :(得分:2)

解决这一类问题的最简单方法可能是安装Process Monitor from microsoft.com

Process Montior让您可以观察正在进行的系统调用,在这种情况下,您将能够看到某些系统调用是否失败。例如,如果您缺少依赖项,那么将看到CreateFile()调用失败,并使用DLL,OCX等作为文件名。

启动procmon并配置过滤器以排除regsvr32.exe以外的事件,重现测试用例,然后检查日志。在返回值列中查找NAME_NOT_FOUND错误。

答案 3 :(得分:1)

答案 4 :(得分:0)

您可以尝试以下几种方法:

  • 尝试启用融合日志的regsvr32(fuslogvw.exe - 它也适用于非托管dll)。这将为您提供更多信息,而不是取决于加载的外部依赖项,它们从何处加载以及遇到的错误。
  • 将.ocx及其依赖项复制到根目录或第一级文件夹,然后尝试从那里注册。我不记得细节了,但是在路径太深的地方注册一个COM dll有一个老问题。
  • WinDbg下运行regsvr32。设置一个断点DllMain,看看它是否有什么时髦。
  • 如果你从未在WinDbg中打破DllMain,为你的dll设置一个breakpoint on module load,一旦它被点击,你可以单步执行LoadLibrary,或者只是设置一个通用的加载库断点并检查之后的每个dll。 / LI>