4

重複タグを付ける前にお読みください。

認証にスマート カードを使用する一連のアプリケーションを作成しています。これまで、各アプリケーションはスマート カード リーダーを個別に制御していました。数週間のうちに、一部の顧客が同時に複数のアプリケーションを使用するようになります。そのため、認証プロセスを制御するサービス アプリケーションを作成する方が実用的ではないかと考えました。デスクトップ アプリケーションが認証プロセスに関心があることをサービス アプリケーションに伝え、サービス アプリケーションが現在のユーザーに関する情報を提供するようにしたいと考えています。この部分は を使用すると簡単named pipesです。難しいのは、イベントが発生したことをサービスがデスクトップ アプリケーションにどのように通知できるかということです (いくつか例を挙げると、、、、UserLogIn... UserLogOut) PermissionsChanged。これまでのところ、私は2つの方法を念頭に置いています。CallBack関数、およびMessages. 誰かがより良いアイデアを持っていますか? 誰かが持っていると確信しています。

4

3 に答える 3

9

DelphiでIPC(Inter Process Communication)をしたい。

役に立つリンクはたくさんありますが、Cromis IPCは、あなたが何を求めているかを理解するための 1 つにすぎません。

あなたと同様の SO の質問がここにあります。

純粋な Windows API を使用する場合は、OutputDebugString 通信の実装方法をご覧ください。
いくつかのツールはメカニズムをリッスンでき、多くのアプリはそれに情報を送信できます。

OutputDebugStringのプロトコルの仕組みの詳細については、 DBWIN_DATA_READYおよびDbWin32を検索してください。

これこれはよく読んでいます。

于 2012-09-05T10:52:04.430 に答える
5

IPC に入るとき、いくつかのヒント:

  • 1 つのプロトコルに縛られないでください。たとえば、名前付きパイプ通信を実装する場合、後でネットワークまたは HTTP を介して実行する必要が生じる可能性があります。
  • 車輪を再発明したり、独自のメッセージを使用したりせず、標準形式 (XML / JSON / BSON など) を使用しないでください。
  • 一般的なパターンは、各デスクトップ クライアントにサーバーを実装し、サーバーから通知を受け取ることになるため、コールバック イベントの実装はやや困難です。

デスクトップ アプリケーションでは、コールバックを使用するのではなく、ステートレスアーキテクチャでポーリングすることをお勧めします。サーバーとの通信チャネルを開き、1 秒 / 0.5 秒 ( UI で a を使用) ごとに、何が変更されたかを尋ねる小さな要求を行います (リビジョン番号または最後に取得したタイムスタンプを入力できます)。したがって、デスクトップ データを保留中のイベントと同期します。既存の接続で更新を要求するのは非常に高速で、何も変更されていなければ、ネットワークを介して 1 つの IP パケットを送受信するだけです。これは非常に小さなタスクであり、クライアントもサーバーも遅くなりません (メモリ内キャッシュを使用している場合)。TTimer

実際には、実際のアプリケーションでは、このようなステートレスアーキテクチャは、エンド ユーザーの観点から非常に応答性が高く、デプロイがはるかに簡単です。デスクトップ アプリケーションごとにサーバーを作成する必要がないため、ファイアウォール ポートなどを開く必要はありません。HTTP はステートレスであるため、インターネット フレンドリーですらあります。

サービスを開発したい場合は、 RemObjectsのようなDataSnapを使用するか、GDI メッセージを使用してインプロセスで REST を介して軽い JSON メッセージを使用してインターフェイス ベースのサービスを作成できるオープン ソースの mORmot フレームワークを試すことができます。パイプまたは TCP/HTTP - 無料で、無敵のパフォーマンス、ビルトイン セキュリティ、Delphi 6 から XE2 まで。イベントベースのタスクの場合、mORMotで利用可能なクライアント サーバー ORM を使用するだけですイベントを格納するテーブル/クラスを作成し (ラウンド ロビン インメモリ ストレージを定義することもできます。ここでは SQLite3 エンジンや DB を使用する必要はありません)、最後の更新以降の保留中のすべてのイベントを要求します。また、サーバーは安全にバックグラウンド サービスまたは通常のアプリケーションにすることができます。一部のmORMotユーザーは、同じ実行可能ファイルを、スタンドアロン アプリケーション、サーバー サービス、アプリケーション サーバー、または UI クライアントのいずれかにすることができます。構成。

編集/発表:

mORMotロードマップでは、サーバーからの一方向のコールバックを簡単に実装するための新しい機能を追加しました。

つまり、透過的な「プッシュ」モードをサービス指向アーキテクチャ フレームワークに追加します。目的は、単一の HTTP 接続を介しても、いくつかの定義を介して、Delphi コードから非常に簡単にサーバー側からトリガーされる通知イベントを実装することinterfaceです。たとえば、WCF ではこれが許可されていません。デュアル バインディングが必要になるため、openファイアウォールポートなど。

これは、パブリッシュ/サブスクライブ パターンを介して簡単なイベント コラボレーションに使用され、イベント ソーシングを可能にします。ポーリングとロック アンド ウェイトの 2 つのモードを実装できるようにします。あなたの質問に対する直接的な答え。

于 2012-09-05T11:40:21.873 に答える
0

単純な TCP ソケット接続 (双方向) を使用して、サーバーからクライアントへの非同期メッセージを同じソケット上で許可できます。

例は Indy TIdTelnetClient クラスで、サーバーからの受信メッセージにスレッドを使用します。

同様のテキストベースのプロトコルを構築できます。必要なのは、サービス内の Indy TCP サーバー インスタンスと、アプリケーション内の 1 つの Indy クライアント インスタンスだけです。

于 2012-09-05T11:39:55.500 に答える