代码之家  ›  专栏  ›  技术社区  ›  Brian Gillespie

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

  •  2
  • Brian Gillespie  · 技术社区  · 17 年前

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

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

    我们的软件是一个本地的64位C++应用程序,但是我们希望通过32位进程访问硬件。对于32位和64位应用程序来说,什么是一种高效、优雅的相互通信方式(理想情况下,不需要发明新的协议)?

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

    6 回复  |  直到 17 年前
        1
  •  6
  •   Hans Passant    17 年前

    如果这是一个真正的驱动程序(内核模式),那么您就是SOL。Vista x64不允许安装未签名的驱动程序。如果这只是一个用户模式DLL,您可以使用任何标准IPC机制进行修复。管道,插座,出proc COM,大致按顺序排列。这一切都取决于总线速度,因此只要您能够缓冲足够的数据,上下文切换开销就不会造成太大的影响。

        2
  •  3
  •   Pyrolistical    17 年前

    我只会使用插座。如果您将来需要它,它将允许您通过IP使用它,并且您不会被一个消息传递API所束缚。如果将来您希望在其他操作系统或语言上实现此功能,您可以。

        3
  •  1
  •   jdigital    17 年前

    This article 可能有兴趣。它讨论了这个问题,然后建议使用COM作为解决方案。我不是COM的超级粉丝,但考虑到它在Windows世界中的普遍性,它可能足够高效。您可能希望构建您的解决方案,以便能够批处理数据(您不希望对每个数据项执行一个COM调用)。

        4
  •  1
  •   Ana Betts    17 年前

        5
  •  1
  •   jdigital    17 年前

    如果司机真的是一个真正的司机,nobugz几乎是对的——你将不得不更加努力地工作,你不是完全的SOL。一种解决方案是在其他机器(或虚拟机)上安装Win32,然后使用某种形式的RPC,例如套接字(如Pyrolistical所建议的)、UDP或MQ,甚至Tibco Rendezvous(它声称支持非常高的吞吐量,以便处理金融市场生成的大量数据——至少在过去我记得是这样)。

        6
  •  1
  •   MSalters    17 年前

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