如何从C++非 COM dll 调试C++ COM dll

How to debug a C++ COM dll from a C++ non-COM dll?

本文关键字:dll COM C++ 调试      更新时间:2023-10-16

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

以下是我已经尝试过的事情。

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

很抱歉,我无法共享代码或详细描述。

有什么解决办法吗?

可以在 COM dll 源代码中设置断点,然后将其附加到名为"dllhost.exe"的进程。每当本机 dll 调用 COM dll 时,都会命中断点。

  1. 将 COM dll 项目设置为启动项目。右键单击该项目。导航到"属性"->"配置"属性"->"调试->命令"。输入客户端应用程序的完整路径。例如:C:\Users...\Debug\ClientApplication.exe。

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

注意:避免直接编辑 windows 注册表并尝试使用 regsvr32 命令。