在我们的应用程序(文档管理系统)中,我们应该被通知屏幕更改(或通知另一个程序屏幕更改),以保持两个应用程序查看相同的数据,一个是订单履行应用程序,另一个是原始传真的文档查看器。履行应用程序使用 vb6 编写,文档管理器使用 .net 3.5 (c#)。它在终端服务器上运行,因此它也必须是会话感知的。可以先打开文档查看器或履行应用程序,并且可以在没有另一个的情况下使用两者。IPC 的最佳方法是什么?
3 回答
如果您希望能够在 Vista 或 Windows 7 上运行,最好的 IPC 形式将是 TCP(这很容易在 VB6 中使用 Winsock 控件完成)。
这样做的好处是两个应用程序可以通信,即使它们不是以同一用户身份运行,它们也可以通信(在 Vista+ 下使用 SendMessage 或命名管道无法做到这一点)。您唯一需要记住的就是在防火墙中设置一条规则,这样它就不会被阻止。这可以在您的安装程序中完成:
netsh.exe firewall set allowedprogram "{PROGRAM PATH}" "{PROGRAM NAME}" enable
命名管道和邮槽仍然是一些可用的最佳选择,它们可以跨用户和跨进程工作。当然,在 Vista+ 中,以不同完整性级别运行的进程存在问题,并且安全性也适用于早期的操作系统——就像文件安全性一样。
TCP 在同一台机器上总是慢得多,甚至可能比跨进程的 WM_COPYDATA 更差。
使用管道或邮槽,您可以通过将会话 ID 作为名称的一部分来处理终端服务。TCP 将始终受到其有限的端口号“命名空间”的挑战(想象一个硬盘驱动器只能包含名为 0 到 65535 的文件 - 每个连接都需要两个端口号)。
Kris 的答案可能仍然是最好的选择,但您可能需要一个杂凑来保持终端服务器的理智。
在您想充当“服务器”应用程序的任何应用程序上,您都可以打开一个未使用的端口,并将其显示为输入到“客户端”应用程序中。甚至可能利用环境变量。根据您的需要,这种方法可能都是错误的。
如果您只有两个应用程序,其中一个需要在另一个更改时通知(而不是通知实际更改的内容),您可以通过发送和挂钩 Windows 消息来做到这一点。