WPUQueueApc 関数 (ws2spi.h)
WPUQueueApc 関数は、重複した I/O 完了ルーチンの呼び出しを容易にするために、指定されたスレッドにユーザー モード非同期プロシージャ呼び出し (APC) をキューに入れます。
構文
int WPUQueueApc(
[in] LPWSATHREADID lpThreadId,
[in] LPWSAUSERAPC lpfnUserApc,
[in] DWORD_PTR dwContext,
[out] LPINT lpErrno
);
パラメーター
[in] lpThreadId
スレッド コンテキストを識別する WSATHREADID 構造体へのポインター。 この構造体へのポインターは、重複する操作への入力パラメーターとして、Ws2_32.dll によってサービス プロバイダーに提供されます。 プロバイダーは WSATHREADID 構造体をローカルに格納し、このローカル ストアへのポインターを提供する必要があります。 WPUQueueApc が戻ると、WSATHREADID のローカル コピーは不要になります。
[in] lpfnUserApc
呼び出される APC 関数へのポインター。
[in] dwContext
その後、APC 関数への入力パラメーターとして指定される 32 ビット コンテキスト値。
[out] lpErrno
エラー コードへのポインター。
戻り値
エラーが発生しない場合、 WPUQueueApc は 0 を返し、指定されたスレッドの完了ルーチンをキューに入れます。 それ以外の場合は、SOCKET_ERRORを返し、 lpErrno で特定のエラー コードを使用できます。
エラー コード | 意味 |
---|---|
dwThreadId パラメーターで有効なスレッドが指定されていません。 |
解説
この関数は、指定されたスレッドに対して APC 関数をキューに入れます。 Windows では、これはユーザー モード非同期プロシージャ 呼び出し (APC) を使用して行われます。 APC は、指定されたスレッドが警告可能な待機でブロックされ、コールバックが直接行われる場合にのみ実行されます。 この呼び出しは、割り込みコンテキスト内で使用しても安全です。
LPWSAUSERAPC は次のように定義されます。
typedef void ( CALLBACK FAR * LPWSAUSERAPC )( DWORD dwContext );
APC メカニズムは 1 つのコンテキスト値のみをサポートするため、 lpfnUserApc 自体は、より多くのパラメーターを含むクライアント指定完了ルーチンにすることはできません。 サービス プロバイダーは、代わりに、指定された dwContext 値を使用して重複する操作に必要な結果情報にアクセスし、クライアント指定完了ルーチンを呼び出す独自の APC 関数へのポインターを指定する必要があります。
ユーザー モード コンポーネントが重複する I/O を実装するサービス プロバイダーの場合、APC メカニズムの一般的な使用方法は次のとおりです。
-
- I/O 操作が完了すると、プロバイダーは小さなバッファーを割り当て、クライアント指定の完了プロシージャへのポインターと、プロシージャに渡すパラメーター値を使用してパックします。
- バッファーへのポインターを dwContext 値として指定し、独自の中間プロシージャをターゲット プロシージャ lpfnUserApc として指定して、APC をキューに入れます。
- ターゲット スレッドが最終的にアラート可能な待機状態になると、サービス プロバイダーの中間プロシージャが適切なスレッド コンテキストで呼び出されます。
- 中間プロシージャは、単にパラメーターをアンパックし、バッファーの割り当てを解除し、クライアント指定の完了プロシージャを呼び出します。
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | ws2spi.h |