【问题标题】:How to debug a C++ COM dll from a C++ non-COM dll?如何从 C++ 非 COM dll 调试 C++ COM dll?
【发布时间】:2015-02-22 10:55:10
【问题描述】:

这里是场景。我正在使用 Visual Studio 2010。我有一个 C++ COM dll。此 dll 由另一个不是 COM 项目的 C++ dll 项目使用。第二个 dll 向客户端应用程序公开 API。依赖是Client->Non-COM dll->COM dll。我想从任何客户端应用程序调试 COM dll。

这是我已经尝试过的东西。

  1. 创建了一个使用非 COM dll 的 C++ win32 控制台应用程序。
  2. 将 COM dll 和非 COM dll 以及相应的 pdb 文件保留在 win32 应用程序的调试目录中。在选项->调试->符号中,我选择了调试目录的路径并选中“仅指定模块”选项来加载这些文件。
  3. 设置所有包含和库依赖项。
  4. 现在,我可以成功运行应用程序了。但是在调试时,我只能通过按 F11 导航到非 COM dll,并且从该 dll 到 COM dll 的相同 F11 导航不起作用。
  5. 当我尝试使用两个非 COM dll 和一个客户端应用程序时,我可以导航到最里面的 dll。此时,我意识到我应该将相应的注册表项更改为指向我位于客户端应用程序调试目录中的 COM dll 文件,但没有运气!

很抱歉我不能分享代码或详细描述。

有什么解决办法吗?

【问题讨论】:

  • 最简单的解释是你没有成功创建COM对象。调试 + Windows + 模块,确保您看到那里列出的 COM dll。右键单击它并选择“符号加载信息”以查看调试器在何处查找 PDB 文件。

标签: c++ visual-studio-2010 dll com


【解决方案1】:

您可以在 COM dll 源代码中设置断点,然后将其附加到名为“dllhost.exe”的进程。每当原生 dll 调用 COM dll 时,就会触发断点。

【讨论】:

  • 就我而言,本机 dll 和 COM dll 都在同一个解决方案中。 1.我将COM项目设置为启动项目。 2.附加dllhost.exe。 3. 将 Properties->Debugging->Command 设置为我的客户端应用程序并进行调试。断点没有命中。这是你的建议还是我在这里遗漏了什么?
  • 打开 2 个 vs 实例,一个带有本机 dll,另一个带有 com dll。将 com dll 项目附加到 dllhost。然后开始调试原生dll项目。
  • 对不起,我不明白。两者都在同一个解决方案中。如果我尝试在两个 VS 实例中同时打开相同的解决方案,则后面的实例会显示“未加载一个或多个项目”,当然是为了避免任何竞争条件。
  • 将它们分隔在两个不同的 Visual Studio 实例中。独立运行它们。
【解决方案2】:
  1. 将 COM dll 项目设置为启动项目。右键单击项目。导航到属性-> 配置属性-> 调试-> 命令。输入客户端应用程序的完整路径。 例如:C:\Users...\Debug\ClientApplication.exe。

  2. 以管理员身份运行 windows 命令提示符,通过命令 regsvr32 "pathToCOMDll" 注册 COM dll。断点将被击中。 例如:regsvr32 "C:\Users...\COMDll.dll" 其中 COMDll.dll 是 COM dll。什么 dll 引用什么 dll 并不重要。

注意:避免直接编辑windows注册表,尽量使用regsvr32命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2019-01-30
    • 2012-09-22
    • 1970-01-01
    • 2013-06-21
    • 2012-12-08
    • 2011-09-26
    相关资源
    最近更新 更多