如何调试 COM C++ 进程外服务器? (客户:Excel vba)

How to debug a COM C++ Out of Process Server ? (client: Excel vba)

我不知道如何使用 Visual Studio 2015 调试 COM ATL C++ 进程外 exe 服务器。

对于COM ATL DLL 没有问题,当我调用COM dll 时断点会自动触发。但是,当我尝试调试 EXE 服务器时,调试器没有中断。实际上,exe 服务器仅在需要时加载,客户端启动时不会加载 exe 服务器的调试符号。

我调用 COM 服务器的客户端是 Excel VBA(我在 VBA 编辑器中添加了对 com exe 的引用,通过 Tools/References).为了调试它,我在 Visual Studio 调试命令中将路径设置为 Excel.exe,并将路径设置为我的 xlsm 文件作为参数。然后我就调用 Excel 中的 VBA 代码。它适用于 com DLL 但不适用于 COM Exe。我也试过将 VS 附加到 Excel 但它没有用。

我找到了这个 post ( Windows COM - how to debug a COM server ),这似乎是由 elevation/permission 问题引起的,但我尝试了建议的答案,但没有奏效。

有人可以帮我解决这个问题吗?

如何调试进程外的 com 服务器?

是否有必要将调试器附加到使用 EXE 服务器的客户端(在我的例子中是 excel)?

尝试调试 EXE 服务器很棘手。

我会做的是修改注册表,以便在加载 EXE 时提示您进行调试。

以下是用于修改注册表的导出 .reg 文件的内容:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\YourExeName.exe]
"debugger"="vsjitdebugger.exe"

将 YourExeName.exe 改成更有用的东西...

启动 EXE 服务器时,系统会提示您启动调试器或从当前 运行 调试器实例附加。已经有了调试器 运行 会更快更好...当我说 "debugger" 时,Visual Studio 的 运行 实例就可以了。

尝试调试 EXE 服务器时的一个问题是,当您设置断点并逐步执行代码时,您可能会超过 COM 超时,然后调用您的进程的 EXE 客户端将由于超时而导致调用失败,并且它只会继续执行。当一切都在进行中时,这就不是问题了。对于 EXE,在您认为可能有问题的区域中的调试版本中包含更多 TRACE 语句可能会有所帮助。

并非严格必须附加到客户端进程。有时它有帮助,有时则没有。如果您有调用客户端进程的源代码,显然会容易得多。