次の方法で共有


コンテキスト ハンドルを使用したインターフェイス開発

通常、IDL ファイルの型定義に [context_handle] 属性を指定してコンテキスト ハンドルを作成します。 型定義では、指定する必要があるコンテキスト ランダウン ルーチンも暗黙的に指定されます。 クライアントとサーバー間の通信が中断した場合、サーバーのランタイムはこのルーチンを呼び出して、必要なクリーンアップを実行します。 コンテキスト ランダウン ルーチンの詳細については、「 サーバー コンテキストの実行ルーチン」を参照してください。

コンテキスト ハンドルを使用するインターフェイスには、最初のバインドのバインド ハンドルが必要です。これは、サーバーがコンテキスト ハンドルを返す前に行う必要があります。 自動、暗黙的、または明示的なバインディング ハンドルを使用して、バインディングを作成し、コンテキストを確立できます。

コンテキスト ハンドルは void * 型、または void * に解決される型である必要があります。 サーバー プログラムによって、必要な型にキャストされます。

Note

コンテキスト ハンドル パラメーターに [in, out] を使用することは、コンテキスト ハンドルを閉じるルーチンを除いて推奨されません。 コンテキストが [in, out] とマークされたパラメーターを処理する場合は、 NULL または初期化されていないコンテキスト ハンドルをクライアントからサーバーに渡さないでください。 代わりに、コンテキスト ハンドルへの NULL ポインターを渡す必要があります。 [in] とマークされたコンテキスト ハンドル パラメーターNULL ポインターを受け入れられません。

 

サンプル インターフェイス定義の次のフラグメントは、分散アプリケーションがコンテキスト ハンドルを使用してサーバーを開き、各クライアントのデータ ファイルを更新する方法を示しています。

インターフェイスには、ハンドルを初期化し、null 以外の値に設定するためのリモート プロシージャ 呼び出しが含まれている必要があります。 この例では、RemoteOpen 関数によってこの操作が実行されます。 [out] 方向属性を持つコンテキスト ハンドルを指定します。 または、コンテキスト ハンドルをプロシージャの戻り値として返することもできます。 ただし、この例では、パラメーター リストを介してコンテキスト ハンドルを渡します。

この例では、コンテキスト情報はファイル ハンドルです。 ファイル内の現在の場所を追跡します。 インターフェイスは、ファイル ハンドルをコンテキスト ハンドルとしてパッケージし、リモート プロシージャ 呼び出しにパラメーターとして渡します。 構造体には、ファイル名とファイル ハンドルが含まれています。

/* file: cxhndl.idl (fragment of interface definition file) */
typedef [context_handle] void * PCONTEXT_HANDLE_TYPE;
typedef [ref] PCONTEXT_HANDLE_TYPE * PPCONTEXT_HANDLE_TYPE;
 
short RemoteOpen([out] PPCONTEXT_HANDLE_TYPE pphContext,
    [in, string] unsigned char * pszFile);
 
void RemoteRead(
    [in] PCONTEXT_HANDLE_TYPE phContext,
    [out, size_is(cbBuf)] unsigned char achBuf[],
    [in, out] short *pcbBuf);
 
short RemoteClose([in, out] PPCONTEXT_HANDLE_TYPE pphContext);

RemoteOpen 関数は、有効な null 以外のコンテキスト ハンドルを作成します。 コンテキスト ハンドルをクライアントに渡します。 RemoteRead などの後続のリモート プロシージャ 呼び出しでは、コンテキスト ハンドルを in ポインターとして使用します。

コンテキスト ハンドルを初期化するリモート プロシージャに加えて、インターフェイスには、サーバー コンテキストを解放し、コンテキスト ハンドルを NULL に設定するプロシージャが含まれている必要があります。 前の例では、RemoteClose 関数はこの操作を実行します。