Microsoft DirectX 8.0 (C++)

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

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

コールバック関数の構造

コールバックの構造は、標準的な Microsoft Windows Win32 API プログラミング ガイドラインに従う。

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

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

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

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

コールバックの登録

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

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

HRESULT WINAPI Callback(PVOID, DWORD, PVOID);
IDirectPlay8Peer* pdp8Peer;

// サーバー インターフェイスを取得する。
hr = CoCreateInstance( CLSID_DirectPlay8Peer, ...)
...

// コールバックを登録する。
hr = pdp8Peer->Initialize(NULL, Callback, 0);