次の方法で共有


クライアント/サーバーアプリケーションのガイドライン

クライアント/サーバー アプリケーションでは、1 台のコンピューター接続が 1 つのユーザー セッションと同等であると想定しないでください。 これは、IP アドレスとコンピューター名で説明されている問題の特殊なケースです。

クライアント/サーバー接続を一意に識別するには、各クライアント モジュールで一意の名前または識別子を使用する必要があります。 アプリケーションでは、名前付きオブジェクトまたはパイプ、ソケット、またはその他の IPC メソッドを使用できます。 詳細については、「カーネル オブジェクト名前空間 を参照してください。

リモート デスクトップ サービスと互換性を持つには、クライアント/サーバー アプリケーション内のサーバー モジュールが、同じコンピューターから接続する複数のクライアントを処理できる必要があります。 これを実現するには、サーバー モジュールは、RPC や名前付きパイプなどの明確に定義されたグローバル インターフェイスを介してクライアント接続を受け入れる必要があります。 サーバーとクライアントは、ユーザー セッションごとに異なる通信チャネルをネゴシエートする必要があります。 クライアントは、この種の操作を簡単にサポートするプロトコル (TCP/IP など) を使用してサーバーへの接続を確立する必要があります。この場合、クライアント アプリケーションごとに異なるソケット接続を使用できます。

クライアント モジュールは、ProcessIdToSessionId 関数を呼び出して、リモート デスクトップ サービス セッションの識別子を取得できます。 その後、クライアントは何らかの形式のプロセス間通信を使用して、セッション識別子をサーバー モジュールに渡します。 その後、クライアントモジュールとサーバーモジュールは、セッション識別子を使用してプライベート通信チャネルを設定できます。 たとえば、サーバー モジュールはセッション識別子を使用して、カーネル オブジェクトのセッションの名前空間内のオブジェクトにアクセスできます。

さらに、サーバー モジュールは、WTSQuerySessionInformation 呼び出しでセッション識別子を使用して、クライアントに関する追加情報を取得できます。 サーバー モジュールは、WTSSendMessage 呼び出しでセッション識別子を使用して、クライアント ターミナルにメッセージを表示することもできます。 サーバー モジュールは、セッションとのクライアント接続とセッションからの切断を監視する 2 つのイベントを作成することもできます。 ただし、これを行うには、リモート デスクトップ セッション ホスト (RD セッション ホスト) サーバーに登録する必要があります。 詳細については、「セッション接続と切断の監視」を参照してください。

ユーザー入力のプロンプトは、クライアント/サーバー アプリケーションの問題の原因となる可能性があります。 たとえば、サービスが MessageBox 関数を呼び出した場合、メッセージ ボックスはクライアント デスクトップではなく RD セッション ホスト サーバーのデスクトップに表示されます。 クライアント デスクトップにメッセージを表示するために、サービスは WtsSendMessage 関数を呼び出すことができます。 または、サービスはクライアント モジュールからの入力を要求でき、クライアント モジュールはユーザー インターフェイスを表示し、結果の入力をサービスに送信できます。

複数のセッションから生成されたプロセスは、共有メモリ ブロックを使用して相互にデータを送受信できます。 詳細については、「名前付き共有メモリの作成」を参照してください。 共有メモリは、次の条件では使用できません。

  • 共有メモリ ブロックを使用するプロセスは、複数のセッションによって生成されました。
  • セッションは同じユーザー認証資格情報を共有します。