【发布时间】:2013-03-20 00:20:09
【问题描述】:
我们有一个系统,其中通常有两个进程在同一个系统上运行。一个进程处理 GUI,另一个进程像服务一样运行(尽管由于历史原因,它不是服务,只是一个没有可见窗口的 exe)。
这两个进程主要通过异步注册消息来进行 IPC - 即我们在两个进程中使用RegisterWindowMessage() 来定义大量消息,这些消息有效地形成了服务器进程的 API。
我编写了一个“免提”监控应用程序,它使用SetWindowsHookEx() 来监控和显示两个进程的消息队列,并提供对 API 的使用方式和通知如何传播到的某种程度的解码GUI 进程(每个单独的窗口都可以直接订阅来自服务器的通知)。
因此,双向都有大量消息,因此我有过滤和汇总计数等,因此我可以专注于特定活动。所有这些都可以在不影响实时代码的情况下完成,这很好。
这一切都很好,但是现在能够“标记”源自 GUI 的消息非常有用,这样我就可以在服务器处理相同的消息时对其进行跟踪。这对于调试和诊断系统问题将非常有用,但是如果不向我们注册的消息 API 添加此类支持,我找不到一个干净的方法(实际上我找不到任何方法!),这将是很多工作,并且涉及比我目前感到舒服的更多风险。由于服务器预处理了一些消息,然后将PostMessage() 返回到自身以执行操作,因此变得更加复杂,因此原始消息可能会“丢失”。
这里有人解决过这类问题吗?如果是这样,你能给我一些指示吗?如果没有,那么是否有任何记录或未记录的方法可以将一小块数据添加到 Windows 消息并稍后检索它?我查看了SetMessageExtraInfo(),但这似乎是每个队列而不是每个消息。
【问题讨论】:
-
如果您注册的消息都没有同时使用
wParam和lParam,您可以将您的标签存储在那里。 -
谢谢 - 但
wParam和lParam使用得很好 :-( 事实上,API 实际上通过 MMF 中的struct传递消息中的大量数据,太多细节无法在这里解释一下。我不想惹那些struct的,这是问题所在。 -
这不是一个选项,别再找了。
-
您如何“跟踪”这些消息?您是否已经判断服务器中的消息 A 是否是其中一个客户端发送的消息 B?如果是这样..“标记”并记住“嗅探器”中的消息怎么样?
-
我假设你在挂钩
PostMessage。如果您可以确定谁调用了PostMessage,您可以将消息参数和调用者保存在一个列表中,以便当它从消息队列中删除时,您可以找到它并获取调用者。您必须在这里小心,以确保您保存的每条消息都被清除。或者您可以保存时间戳并定期清理旧消息的缓存。
标签: windows winapi visual-c++ visual-studio-2012 trace