我们想支持最近停产的一些硬件。硬件的驱动程序是一个普通的32位C DLL。我们没有源代码,并且(出于法律原因)对驱动程序的反编译或逆向工程不感兴趣。
硬件快速发送大量数据,因此通信协议需要非常高效。
我们的软件是原生的64位C ++应用程序,但我们希望通过32位进程访问硬件。什么是32位和64位应用程序相互通信的高效,优雅的方式(理想情况下,这不涉及发明新协议)?
解决方案应该是C / C ++。
更新:一些受访者要求澄清这是用户模式还是内核模式驱动程序。幸运的是,它是一个用户模式驱动程序。
答案 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个视图,即你不是在物理上复制内存。零拷贝和它一样好