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

3
我们希望支持一些最近停产的硬件。该硬件的驱动程序是一个简单的32位C DLL,我们没有源代码,并且(由于法律原因)不想对驱动程序进行反编译或逆向工程。
硬件快速发送大量数据,因此通信协议需要相当高效。
我们的软件是本地64位C ++应用程序,但我们希望通过32位进程访问硬件。有没有一种高效而优雅的方法,可以让32位和64位应用程序彼此通信(最好不涉及发明新协议)?
解决方案应为C / C ++。
更新:几位回答者要求澄清这是否为用户模式或内核模式驱动程序。幸运的是,这是一个用户模式驱动程序。
6个回答

6

如果这是一个真正的驱动程序(内核模式),那么你就没戏了。Vista x64不允许安装未签名的驱动程序。如果这只是一个用户模式的DLL,您可以通过使用任何标准的IPC机制来获取修复。管道、套接字、进程间COM,大致按照这个顺序。它们都在总线速度上运行,因此只要您能缓冲足够的数据,上下文切换开销就不会对性能造成太大影响。


3

我会建议您使用套接字(Socket)。这样可以让您以后在IP上使用它,而且您不必局限于一种消息传递API。如果将来您希望在另一个操作系统或语言上实现它,也可以轻松实现。


1

这篇文章可能会引起您的兴趣。它讨论了问题,然后建议使用COM作为解决方案。虽然我不是COM的忠实粉丝,但考虑到它在Windows领域的无处不在,它可能足够高效。您可能需要设计您的解决方案,以便可以批量处理数据(您不希望为每个数据项执行一次COM调用)。


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

1
如果驱动程序确实是一个真正的驱动程序,nobugz几乎是正确的 - 你将不得不工作得更加努力,但你并不完全没有希望。一种解决方案是在另一台机器(或虚拟机)上安装Win32,然后使用某种形式的RPC,如sockets(由Pyrolistical建议),UDP或MQ,甚至是Tibco Rendezvous(它声称支持非常高的吞吐量,以处理金融市场生成的大量数据 - 至少这是我从旧日记忆中记得的)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接