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 で特定のエラー コードを使用できます。

エラー コード 意味
WSAEFAULT
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

関連項目

WSATHREADID

LPWSPIoctl

LPWSPRecv

LPWSPRecvFrom

LPWSPSend

LPWSPSendTo