Windows IPC方法是什么?

5

问题:我有一个可以在另一个程序中加载的dll。 现在,该dll可以访问其他程序中的所有数据/函数。

我应该使用哪种技术,以便外部程序可以向该dll发送数据/命令,以控制其他程序或从其获取数据?

我的意思是,在过去,这意味着DDE,我认为那是在Windows 3.11/95时代。 今天我应该使用什么?哪个最容易?哪个最快?

5个回答

7

一些常见的通信方式包括:

  • 命名管道。实现相对简单。
  • 共享内存。需要更多工作,但在我的测试中可能会更快一些。
  • 套接字。这种方式相对简单且可移植性强,但性能不如其他方式高。不过,如果您突然想与在另一台机器上运行的进程进行通信,这种方式是很好的选择。

为了让这个列表更完整,我想提一下这个链接到 MSDN,它列出了所有可用的方法 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.aspx 我认为最好的两种方法是 Pipes 和 SharedMemory,尽管我迄今为止还没有比较它们的性能,并且对于 C#,Shared Memory 似乎是最快和最容易的实现,尽管我不知道它是否像 Pipes 那样允许通过网络进行通信 http://www.codeproject.com/Articles/138290/Programming-Memory-Mapped-Files-with-the-NET-Frame - Anonymous
看起来这两个链接终于让每个人都能选择最合适的方法了:http://en.wikipedia.org/wiki/Inter-process_communication,这里可以找到一些优缺点 - https://dev59.com/nXRC5IYBdhLWcg3wG9Xp。 - Anonymous

5

COM是当今Windows应用程序的事实标准IPC机制。

它允许跨语言界限访问,解决二进制接口兼容性问题,为您执行透明的编组,并具有不同的线程模型。

sharptooth这里很好地总结了一些事实。


1
OP提到了发送数据和命令。如果发送方和接收方在同一个用户账户中运行,则发送命令的绝佳选择是定义自定义的WM_APP或WM_USER消息,并使用PostMessage()进行传递。Windows仍然是Windows。
如果接收程序没有窗口,您可以始终为其提供一个不可见的窗口。如果由于某种原因无法执行此操作,则PostThreadMessage()是备选项。这不被认为是最佳实践,因为它在窗口管理器之外工作,但它确实有效。
当然,如果发送方和接收方在不同的账户中运行,则PostMessage()和PostThreadMessage()都将无法正常工作。您必须使用已经提到的支持Windows安全性的其他方法之一。

0

对于简单、快速的通信,您可以考虑使用邮槽。它们非常容易使用,您可以像操作文件一样与它们交互。

邮槽最适合在您想要向多个接收者广播命令或从多个生产者接收消息,并且您的设计可以容忍偶尔丢失消息时使用。如上所述,命名管道更适合单进程到单进程、保证传递的IPC。

好消息

  • 它们非常容易实现
  • 它们支持异步操作
  • 即使在Windows进程隔离的情况下也可以使用它们。这意味着您可以使用它们在不同的用户会话之间进行通信(例如,与Windows服务)
  • 它们可以通过打开到“\*\mailslot[path]name”邮槽来向整个域广播消息。当您写入具有该名称的邮槽时,它将将其发送到域中每台计算机上具有该名称的每个邮槽

坏消息

  • 网络传输只能传输424字节。更多的数据可以在本地传输。
  • 它们是基于UDP的,所以只有在偶尔丢失消息的情况下才使用它们。
  • 偶尔(特别是在多处理器系统上),消息可能会被稍微错位地传递。

有很多示例可用,但我还没有足够的声望来发布更多的 C++代码


0
不要忘记 Remoting,它可以为 .NET 提供更高级别的可能性。

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