Windows x64上32位和64位应用程序之间的进程间通信

时间:2009-02-03 00:48:01

标签: c++ winapi interprocess

我们想支持最近停产的一些硬件。硬件的驱动程序是一个普通的32位C DLL。我们没有源代码,并且(出于法律原因)对驱动程序的反编译或逆向工程不感兴趣。

硬件快速发送大量数据,因此通信协议需要非常高效。

我们的软件是原生的64位C ++应用程序,但我们希望通过32位进程访问硬件。什么是32位和64位应用程序相互通信的高效,优雅的方式(理想情况下,这不涉及发明新协议)?

解决方案应该是C / C ++。

更新:一些受访者要求澄清这是用户模式还是内核模式驱动程序。幸运的是,它是一个用户模式驱动程序。

6 个答案:

答案 0 :(得分:6)

如果这是一个真正的驱动程序(内核模式),那么你就是SOL。 Vista x64不允许安装未签名的驱动程序。它只是一个用户模式DLL,您可以通过使用任何标准IPC机制来获得修复。管道,套接字,进程外COM,大致按顺序排列。它都以总线速度运行,因此只要你可以缓冲足够的数据,上下文切换开销不应该太大。

答案 1 :(得分:3)

我只想使用套接字。如果将来需要它,它将允许您通过IP使用它,并且您不会被限制为一个消息传递API。如果将来您希望在其他操作系统或语言上实现此功能,则可以。

答案 2 :(得分:1)

This article可能会引起人们的兴趣。它讨论了该问题,然后建议使用COM作为解决方案。我不是COM的忠实粉丝,但鉴于它在Windows世界中无处不在,它可能足够高效。您可能希望构建解决方案,以便批量处理数据(您不希望为每个数据项执行一次COM调用)。

答案 3 :(得分:1)

优雅? C ++?对自己的DCOM / RPC调用可能有效,或者您可以创建一个命名管道并使用它来在两个进程之间进行通信(可能创建一个“CMessage类”或其他东西),但要注意x86和x64之间的不同结构对齐。 / p>

答案 4 :(得分:1)

如果司机确实是一名真正的车手,那么nobugz几乎是正确的 - 你将不得不更加努力地工作,你不是完全SOL。一种解决方案是在其他计算机(或虚拟机)上安装Win32,然后使用某种形式的RPC,例如套接字(如Pyrolistical所建议)或UDP或MQ甚至Tibco Rendezvous(声称支持非常高的吞吐量顺序)处理金融市场产生的大量数据 - 至少这是我过去记得的情况。)

答案 5 :(得分:1)

双方共享的内存映射文件具有相同的内容。操作系统将不得不做一些有趣的指针来实现它,但很可能能够以这样的方式设置2个视图,即你不是在物理上复制内存。零拷贝和它一样好