次の方法で共有


ロビー起動の取り扱い

ロビー起動の取り扱い

ロビー可能アプリケーションが起動したときにまず実行しなければならないのは、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;
}