次の方法で共有


DirectPlay と DirectPlay Voice におけるコールバック関数の実装

DirectPlay と DirectPlay Voice におけるコールバック関数の実装

Microsoft® DirectPlay® と DirectPlay Voice では、DirectPlay が発行するイベントを処理するため、いくつかのコールバック関数を独自に実装する必要がある。DirectPlay はマルチスレッド化されているので、同時に複数のイベントを発行することがある。したがって、DirectPlay のコールバックで正しく信頼性の高いデータ アクセスを行うには、同期をマルチスレッド化する手段を実装しなければならない。このことを、コールバックを再入可能またはスレッドセーフにすると呼ぶ。

コールバック関数の構造

コールバックの構造は、標準的な Microsoft Win32® アプリケーション プログラミング インターフェイス (API) プログラミング ガイドラインに従っている。

HRESULT WINAPI Callback(
  PVOID pvUserContext,
  DWORD dwMessageType,
PVOID pMessage );

pvUserContext は、DirectPlay にコールバック関数を登録するときに指定するコンテキスト値である。コールバックの登録時に DirectPlay にこの値を渡すと、DirectPlay がコールバックを起動するときに、このコンテキスト値が返される。

dwMessageType は、DirectPlay からコールバックに渡される識別子 (ID) 値のいずれかである。

pMessage には、DirectPlay から渡されたメッセージが格納される。

コールバックの登録

DirectPlay のネットワーキング コールバック関数は、PFNDPNMESSAGEHANDLER 型である。ネットワーキング セッションの種類に応じて、IDirectPlay8Peer::InitializeIDirectPlay8Client::Initialize、または IDirectPlay8Server::Initialize を使ってコールバック関数のアドレスを登録する。DirectPlay ボイス コールバック関数を登録している場合、コールバックのアドレスは、IDirectPlayVoiceClient::Initialize または IDirectPlayVoiceServer::Initialize を使って登録する。 使用するインターフェイスは、作成する DirectPlay ボイス セッションの種類によって異なる。

次のサンプル コードは、IDirectPlay8Peer インターフェイスを使ってコールバック関数を登録する方法を示している。

HRESULT WINAPI Callback(PVOID, DWORD, PVOID);

IDirectPlay8Peer* pdp8Peer;



// Get the server interface
hr = CoCreateInstance( CLSID_DirectPlay8Peer, ...)
...

// Register the callback
hr = pdp8Peer->Initialize(NULL, Callback, 0);