【问题标题】:How to debug a COM C++ Out of Process Server ? (client: Excel vba)如何调试 COM C++ Out of Process Server ? (客户端:Excel vba)
【发布时间】:2017-05-30 22:29:31
【问题描述】:

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

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

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

我找到了这篇文章 (Windows COM - how to debug a COM server),这似乎是由提升/权限问题引起的,但我尝试了建议的答案,但没有奏效。

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

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

是否有必要将调试器附加到使用 EXE 服务器的客户端(所以在我的情况下是 excel)?

【问题讨论】:

    标签: excel com atl vba


    【解决方案1】:

    调试 EXE 服务器很棘手。

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

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

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

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

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

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

    不一定要附加到客户端进程。有时它有帮助,有时没有。如果您有调用客户端进程的源代码,显然会容易得多。

    【讨论】:

    • 以这种方式完成调试后,我要做的一个技巧是转到注册表并在注册表项前加上下划线,例如:_YourExeName.exe。它做了两件事...... 1)停止调试器的提示,2)如果我想再次调试 EXE,它更容易找到,因为它是 Image File Execution Options 键中列出的第一个,我可以删除下划线以这种方式返回调试。
    • 非常感谢乔,问题解决了!你刚刚拯救了我的一天 :) 网络上几乎没有关于它的内容,而你的答案是迄今为止我读到的关于它的最佳信息 :) 也感谢你的技巧。对于其他人:遵循此答案,只需跳过对与“/RegServer”调用相对应的调试器的第一次调用。只需构建 COM 服务器,跳过对 JIT 调试器的第一次调用,运行您的客户端,当调用服务器时调试器将弹出。太好了,请注意超时问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多