私たちのアプリケーション (ドキュメント管理システム) では、2 つのアプリケーションが同じデータを見続けるために、画面の変更が通知される (または他のプログラムに画面の変更が通知される) ことになっています。元のファックスのドキュメント ビューア。フルフィルメント アプリは vb6 で作成され、ドキュメント マネージャーは .net 3.5 (c#) で作成されています。ターミナル サーバー上で実行されるため、セッションに対応している必要があります。ドキュメント ビューアーまたはフルフィルメント アプリを最初に開いて、どちらか一方を使用せずに両方を使用することができます。IPC の最良の方法は何ですか?
3 に答える
Vista または Windows 7 で実行できるようにしたい場合、IPC の最適な形式は TCP になります (Winsock コントロールを使用して VB6 から非常に簡単に実行できます)。
これの利点は、2 つのアプリが同じユーザーとして実行されていなくても通信できることです (Vista 以降では、SendMessage または名前付きパイプでは通信できません)。覚えておく必要がある唯一のことは、ブロックされないようにファイアウォールにルールを設定することです。これは、インストーラーで次のように実行できます。
netsh.exe firewall set allowedprogram "{PROGRAM PATH}" "{PROGRAM NAME}" enable
クリスの答えはおそらく最善の策ですが、ターミナルサーバーで健全性を維持するには、おそらくクラッジが必要になるでしょう.
「サーバー」アプリとして機能させたいアプリケーションで、未使用のポートを開き、それを表示して「クライアント」アプリに入力することができます。おそらく環境変数を利用することさえあります。ニーズによっては、このアプローチがすべて間違っている可能性があります。
単純に 2 つのアプリがあり、一方が変更されたときに一方に通知する必要がある (そして実際に何が変更されたかは通知されない) 場合は、おそらく Windows メッセージを送信してフックすることでそれを行うことができます。
名前付きパイプとメールスロットは、依然として利用可能な最良の選択肢の一部であり、クロスユーザーおよびクロスプロセスで機能します. もちろん、Vista 以降では、さまざまな整合性レベルで実行されるプロセスに問題があり、ファイル セキュリティと同様に、以前の OS にもセキュリティが適用されます。
TCP は同じマシン内では常に非常に遅く、おそらくプロセス全体で WM_COPYDATA よりもさらに遅くなります。
パイプまたはメールスロットを使用すると、セッション ID を名前の一部にすることでターミナル サービスを処理できます。TCP は常にポート番号の制限された「名前空間」に挑戦します (0 から 65535 までの名前のファイルしか持てないハード ドライブを想像してみてください。各接続には 2 つのポート番号が必要です)。