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::Initialize、IDirectPlay8Client::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);