DLL注入/ IPC问题

时间:2009-10-21 14:19:18

标签: c++ winapi dll shared-libraries

我正在开发一个可以启动数千个进程(编译,链接等)的构建工具。它还将可执行文件分发到远程计算机,以便可以在100多台从属计算机上运行构建。我正在实现DLL注入来监视我的构建过程的子进程,以便我可以看到他们打开/关闭了我期望它们的资源。这样我可以判断我的用户是否没有正确指定依赖关系信息。

我的问题是:

我有DLL注入工作,但我不熟悉windows编程。使用子项将生成的数百万个文件io报告回调到父构建过程的最佳/最快方法是什么?我曾经考虑让他们写一个非阻塞套接字,但一直想知道是否管道/共享内存或COM可能更好?

4 个答案:

答案 0 :(得分:1)

如果你留在windows世界(你的机器都不是Linux或其他什么),命名管道是一个不错的选择,因为它很快,可以通过机器边界访问。我认为共享内存已脱离竞争,因为它无法跨越机器边界。分布式com允许在IDL中制定合同,但我认为通过管道的XML消息也可以。 xml消息具有完全独立于通道的优点。如果您以后需要linux,可以切换到tcp / ip transport并发送您的xml消息。

一些有限制的其他技巧:

另一个被遗忘但热门的候选人是RPC(远程过程调用)。许多Windows服务依赖于此。但我认为编写RPC

很难

如果您在同一台计算机上并且只需要发送一些状态信息,则可以通过RegisterWindowMessage()登录Windows消息,并通过SendMessage()

发送消息

答案 1 :(得分:1)

首先,由于您显然是在处理机器之间的通信,而不仅仅是在一台机器内,我会立即排除共享内存。

我认真考虑尽量减少数据量,而不是担心发送速度有多快。我没有发送数百万个文件I / O报告,而是将几千字节的数据(或该订单上的某些内容)批处理并发送该数据包的哈希值。仔细选择数据包大小,您应该能够将数据传输减少到可以简单地使用您认为最方便的方法,而不是尝试选择最快的方法。

答案 2 :(得分:0)

除了托马斯的所有建议外,您还可以使用通用数据库来存储结果。如果这太慢,请使用一个更现代(和快速)的键/值数据库(如tokyo cabinet / memcachedb / etc)。

答案 3 :(得分:0)

对于验证构建中使用的文件的任务来说,这听起来有点过分。怎么样,只是扫描构建文件?或者从构建工具中捕获输出?