如何将 [D]COM 调用记录到模块中?

Posted

技术标签:

【中文标题】如何将 [D]COM 调用记录到模块中?【英文标题】:How can I log [D]COM calls into a module? 【发布时间】:2014-11-25 10:48:45 【问题描述】:

有没有一种方法可以监视和记录带有参数的 COM 调用,并将其制成特定的 EXE/DLL 模块,而无需向模块本身显式添加日志记录功能?我正在考虑如何在 Spy++ 中跟踪 Windows 消息,但对于 COM。

动机是为了诊断和自动化测试目的而记录调用 - 例如。单击客户端 PC 上窗口上的按钮,监视发送到服务器模块的 COM 调用,然后在不需要客户端 PC 的情况下“重放”这些调用。

如果存在执行此操作的工具,那就太好了。如果没有,是不是可以写,如果可以怎么写?

【问题讨论】:

【参考方案1】:

COM 方法的调用者只是调用约定约定的函数。参数等,并且在调用者和被调用者之间没有中间层,除非代理/存根对正在编组调用。即使在后一种情况下,也有标准的方法来挂接调用以进行日志记录,您可以在没有特定准备工作的情况下执行此操作。总而言之,您需要自己负责跟踪呼叫和诊断。 In 可以直接登录每个感兴趣的方法的 prolog,或者您可以将您的对象/接口包装到自定义的中间层中,该中间层跟踪调用并将其进一步传递给预期的被调用者(例如描述的 here)。

【讨论】:

啊,COM 直接编译为裸调用,因此没有什么to 像消息那样拦截。谢谢你的链接。我是否认为可以在完全独立的模块中提供代理,而无需修改原始模块 - 它忽略了代理?我想我真正想要的是能够从我的 IDL 为我感兴趣的 COM 接口自动生成日志代理 - 这听起来可行吗? 如果你构建了一个通用的日志代理,你仍然需要把它放在真实代码中的某个地方,例如一个方法将返回一个代理而不是裸接口指针。我的意思是即使可以做一个涵盖很多东西的代理,要跟踪的模块仍然必须有一些代码来集成这个代理。你应该这样看:我的代码通过指针工作,方法遵循一些约定,在一定程度上缩小了可能调用的多样性。我怎样才能普遍记录电话。显然,这项任务并不像启用某些东西那么容易。 请原谅我的意思,但是你是说像 CoCreateInstance 这样的调用的钩子必须与所涉及的 COM 类在同一个模块中吗?或者我可以创建一个具有全局挂钩并为特定 IID 创建代理的全新应用程序吗? CoCreateInstance 并不是唯一可以为您提供 COM 接口的 API。任何 COM 方法都可以直接或在 VARIANT 或结构等内部返回一个接口。基本上,您可以挂钩某些东西,您将获得一小部分跟踪调用。如果这些是您感兴趣的特定调用,您可能想试一试,但如果不隔离特定范围,我会说您最好的方向是代码中的传统日志记录/跟踪。

以上是关于如何将 [D]COM 调用记录到模块中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ZF2 单元/应用程序模块测试合并到单个调用中?

打印日志查看调接口时间

如何在 ATL COM 模块中打印控制台输出?

如何将集成到 Intellij 中的模块('com.intellij.modules.java')复制到其他 JetBrain 的产品中?

如何从 Python 日志记录模块获得非阻塞/实时行为? (输出到 PyQt QTextBrowser)

调用自定义模块出现ModuleNotFoundError的问题