C++ 为什么我的DLL无法注册?

C++ 为什么我的DLL无法注册?,c++,com,dll,registry,C++,Com,Dll,Registry,我正在VS2005中构建一个项目,我的几个DLL无法注册。我在Visual Studio中收到的错误消息是: 项目:错误PRJ0019:工具从“注册ActiveX控件…”返回错误代码 这很模糊。通过命令行手动注册DLL时(使用regsv32.exe),出现以下错误: LoadLibrary(“test.ocx”)失败-由于应用程序配置不正确,此应用程序无法启动。重新安装应用程序可能会解决此问题 我在culprit.ocx文件上运行了Dependency Walker(dependence.exe

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

项目:错误PRJ0019:工具从“注册ActiveX控件…”返回错误代码

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

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

我在culprit.ocx文件上运行了Dependency Walker(
dependence.exe
),但它没有显示任何明显的问题

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


关于如何确定注册失败的原因,有什么建议吗?

解决这类问题的最简单方法可能是安装

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


启动procmon并将筛选器配置为排除regsvr32.exe以外的事件,复制测试用例,然后检查日志。在返回值列中查找“名称未发现”错误。

您是否有最有可能的原因是因为嵌入的清单。您应该使用资源管理器应用程序并检查DLL是否存在错误r嵌入的清单。可能是某个依赖DLL(或您的DLL)需要其他不存在的DLL的某些版本


我收到这样一条消息:“由于应用程序配置不正确,此应用程序无法启动。”如果嵌入式清单不匹配。

您可以尝试以下几点:

  • 尝试使用启用了fusion log的regsvr32(-它也适用于非托管DLL)。这将为您提供更多的信息,而不仅仅取决于加载的外部依赖项、它们从何处加载以及遇到的错误
  • 将.ocx及其依赖项复制到根目录或一级文件夹中,然后尝试从那里注册。我不记得详细信息,但从太深的路径中注册COM dll时存在一个老问题
  • 在下运行regsvr32。设置一个断点DllMain,看看它是否做了一些奇怪的事情
  • 如果您从未中断WinDbg中的DllMain,请为dll设置一个断点,一旦它被命中,您可以单步执行LoadLibrary,或者只设置一个通用的LoadLibrary断点,然后检查每个dll

Microsoft最近发布了ATL(KB971090)的安全更新。它是MSVS2005sp1之上的未更新版本,同时也是编译时间和运行时兼容性的破坏程序。请检查您的建筑环境是否有此修补程序

参考资料:

  • ATL安全更新:
  • 正在中断ATL中的更改:
  • 这是一个必须阅读的

是的,仅使用进程监视器就可以诊断出这么多问题。这似乎是迄今为止最有可能的解释-我认为这与更新可再发行DLL的修补程序有关。关于如何检查我的DLL正在查找的可再发行DLL的哪个版本,您是否有更多信息?我知道我有问题ms使用VS2005的SP1,它更改了MSVCRT DLL的版本。我所做的是检查依赖项(例如使用依赖项walker),然后获取每个DLL(包括我的),并检查嵌入的清单(如果有)查看DLL的版本以及从属DLL清单中指定的所需版本。很可能是因为标准库DLL修补程序。如果版本不匹配,我也被迫重建这些DLL。我已经安装了DLL,但我感觉我公司的修补系统推出了更新版本的redistri但是,这是造成所有这些头痛的DLL。最后一个链接+1。这是解释;我已经改变了接受的答案,这一个了。