ロビー起動の取り扱い
ロビー起動の取り扱い
ロビー可能アプリケーションが起動したときにまず実行しなければならないのは、Microsoft® DirectPlay® ロビー対象アプリケーション オブジェクトの作成および初期化である。これには、以下の処理を実行する。
- CoCreateInstance を呼び出して、ロビー アプリケーション オブジェクト (CLSID_DirectPlay8LobbiedApplication) を作成する。riid パラメータを IID_IDirectPlay8LobbiedApplication に設定して、IDirectPlay8LobbiedApplication インターフェイスを要求する。
- IDirectPlay8LobbiedApplication::Initialize を呼び出して、ロビー アプリケーション オブジェクトを初期化する。ロビー対象アプリケーションのコールバック メッセージ ハンドラへのポインタを、オブジェクトに渡す。
次に、アプリケーションがロビー起動したかどうかを判断する。ロビー起動している場合は、セッションを効率よく管理するために、アプリケーションで DirectPlay との通信チャンネルを設定する必要がある。アプリケーションがロビー起動したかどうかを判断するには、以下の処理を実行する。
- IDirectPlay8LobbiedApplication::Initialize メソッドが戻ったら、pdpnhConnection パラメータを調べる。このパラメータが有効な接続ハンドルに設定されている場合、ゲームはロビー起動している。
- メッセージ ハンドラを通じて受け取った DPL_MSGID_CONNECT メッセージを調べる。このメッセージには、ロビー クライアントにメッセージを送信するときに使う ID を含む、各種の情報が付属している。
注 メッセージ ハンドラは、IDirectPlay8LobbiedApplication::Initialize メソッドが戻る前に DPL_MSGID_CONNECT メッセージを受け取ることがある。メッセージ ハンドラは、このメッセージを適切に処理する用意ができていなければならない。
アプリケーションがロビー起動していない場合は、IDirectPlay8LobbiedApplication::SetAppAvailable を呼び出すと、ロビー クライアントからアプリケーションに接続可能であることを示すことができる。このメソッドは、通常、ユーザーがアプリケーションを起動したときに呼び出される。ただし、ユーザーが 1 つのセッションを閉じたが、アプリケーションがまだ動作していて、別のセッションで利用可能な場合にも、このメソッドを使うことができる。どちらの場合も、ロビー クライアントがアプリケーションをセッションに接続すると、メッセージ ハンドラは DPL_MSGID_CONNECT メッセージを受信する。
次のサンプル コードは、ロビー対象アプリケーションの初期化方法、およびアプリケーションがロビー起動しているかどうかを判断する方法を示している。これは、ソフトウェア開発キット (SDK) の SimplePeer アプリケーションで使われる InitDirectPlay 関数を簡略化したものである。完全なコードについては、上記サンプル アプリケーションを参照すること。わかりやすくするため、主にエラー処理コードが削除されている。g_bWasLobbyLaunched はグローバル変数であり、アプリケーションがロビー起動している場合に TRUE に設定される。
HRESULT InitDirectPlay()
{
DPNHANDLE hLobbyLaunchedConnection = NULL;
HRESULT hr;
// Create IDirectPlay8LobbiedApplication
hr = CoCreateInstance( CLSID_DirectPlay8LobbiedApplication, NULL,
CLSCTX_INPROC_SERVER,
IID_IDirectPlay8LobbiedApplication,
(LPVOID*) &g_pLobbiedApp );
// Initialize IDirectPlay8LobbiedApplication
hr = g_pLobbiedApp->Initialize( NULL,
DirectPlayLobbyMessageHandler,
&hLobbyLaunchedConnection,
0 );
//Check for a valid connection handle.If it is non-NULL
//the application was lobby launched.
g_bWasLobbyLaunched = ( hLobbyLaunchedConnection != NULL );
return S_OK;
}