1

我有一个创建 COM DLL 的 Visual C++ 6 项目。这是一个我多年未使用过的旧项目,但最近我又回来更新 DLL 的一些功能。我遇到的问题是,当我尝试手动注册项目创建的 DLL(使用 regsvr32)时,我没有得到任何响应。它没有说它成功,也没有说它失败。我已经验证 DLL 没有被添加到注册表中。我从未见过 regsvr32 不会显示任何确认消息的情况。

此外,DLL 设置为在项目中自行注册,当它尝试这样做时,它也不会显示消息。

我已经很久没有碰过这个项目了,但我上次碰过它时,它没有问题。现在我回到它,突然之间我遇到了这个问题。就好像 Visual C++ 项目正在创建的 DLL 与当前版本的 Windows 不兼容。我已将开发软件更新到 SP6,但并没有改变这种情况。

当它指向创建的 DLL 时,我运行 Depends on regsvr32,它显示以下消息:

LoadLibraryExW("C:\Source32\BIS\Projects\ALFA\DigiPixSvc\DigiPixObj\Debug\DigiPixObj", 0x00000000, LOAD_WITH_ALTERED_SEARCH_PATH) 返回 NULL。错误:操作系统无法运行 %1 (182)。

谁能告诉我为什么会发生这种情况以及我能做些什么来纠正它?

4

1 回答 1

0

免责声明:由于我不再安装 VS 6.0,我将不得不使用一些 Google 搜索来为您提供 VC 6.0 对话框的确切步骤 - 所以其中一些信息可能不准确。我相信这是正确的——这确实是您在当前 IDE 中所做的,仅适用于 VC 6.0。

在您调试 DLL 的麻烦之前,请确保您通过Dependency Walker运行它以验证您的所有依赖项都在您的计算机上。不要在 regsvr32 上运行Dependency Walker - 重要的是您的 DLL 是否具有其依赖项。如果它们丢失,regsvr32 将无法加载 DLL。

要查看您的 DLL 是否在您尝试注册时被 regsvr32 加载,您需要通过该DLLRegisterServer()函数进行调试并查看那里发生了什么 - 这是 COM DLL 必须具有的 4 个入口点之一,并且 regsvr32 在DLL 即将注册。为此,您必须将 regsvr32 设置为项目的启动程序,并将调试构建的 DLL 的完整路径作为命令行参数传递给 regsvr32。

  • 为您的项目调出项目属性
  • 转到调试选项卡。
  • 确保选择了常规类别。
  • 在Executable for debug session文本框中输入 regsvr32 的完整路径。
  • 在程序参数文本框中输入 DLL 调试版本的完整路径。确保您的 DLL 有一个 PDB 文件,以便在调试期间可以看到符号信息。
  • 将断点放在DLLRegisterServer(). 此函数中的代码可长可短,具体取决于它的创建方式:由向导生成、由开发人员编写等。
  • 开始调试。

您的断点应该被击中,您应该能够单步执行注册代码并查看它在哪个点失败。

于 2012-10-30T21:38:06.137 回答