2009-10-15 84 views
3

我正在VS2005中建立一个项目,我的一些DLL没有注册。我在Visual Studio中得到的错误消息是:为什么我的DLL无法注册?

Project : error PRJ0019: A tool returned an error code from "Registering ActiveX Control..."

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

LoadLibrary("test.ocx") failed - This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix the problem.

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

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

任何建议,我怎么能确定此故障的原因进行登记?

回答

3

微软最近发布了ATL安全更新(KB971090)。它不在MSVS2005sp1的基础上更新,而且它是兼容性时间和运行时兼容性断路器。检查你的建筑环境是否有这个补丁。

参考文献:

+0

最后一个链接为+1。这是解释;我现在已经改变了这个接受的答案。 – LeopardSkinPillBoxHat 2010-02-10 00:18:14

2

也许最简单的方法解决这个问题的整个类别是安装Process Monitor from microsoft.com

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

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

+0

是的,所以很多问题都可以用Pro来诊断监视器。 – sharptooth 2009-10-15 05:23:00

3

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

我收到此消息:“此应用程序未能启动,因为应用程序配置不正确。”在嵌入式清单错配的情况下。

+0

这似乎是迄今为止最可能的解释 - 我认为它与修补程序更新可再发行组件中的DLL有关。您是否还有关于如何检查我的DLL正在查找哪个版本的可再发行DLL的信息? – LeopardSkinPillBoxHat 2009-10-15 07:08:56

+0

我知道我对VS2005的SP1有问题,它改变了MSVCRT dll的版本。我所做的是检查依赖关系(例如使用依赖关系walker),然后获取每个DLL(包括我的)并检查嵌入式清单(如果有)以查看DLL的版本以及在依赖项的清单中指定的所需版本DLL。最有可能是因为标准库DLL修补程序。如果版本不匹配,我不得不重建这些DLL。 – 2009-10-15 07:27:43

0

有几件事情,你可以尝试:

  • 尝试REGSVR32W¯¯启用/融合日志(fuslogvw.exe - 它适用于非托管的dll以及)。这会给你更多的信息,而不是依赖于什么样的外部依赖被加载,他们从哪里加载和哪些错误被击中。
  • 将.ocx及其依赖关系复制到根或第一级文件夹并尝试从那里注册。我不记得细节,但是在路径太深的地方注册一个COM DLL时存在一个老问题。
  • 根据WinDbg运行regsvr32。设置一个断点DllMain,看看它是否有什么奇怪的东西。
  • 如果你永远不会在WinDbg中使用DllMain,那么为你的dll设置一个breakpoint on module load,一旦命中,你可以选择LoadLibrary,或者设置一个通用的加载库断点,然后检查每个dll。