Microsoft DirectX 8.0 (C++)

ロビー起動の取り扱い

ロビー可能アプリケーションが起動されたときにまず実行しなければならないのは、Microsoft® DirectPlay® ロビー対象アプリケーション オブジェクトの作成および初期化である。これには、以下の処理を実行する。

次に、アプリケーションがロビー起動されたかどうかを判断する。ロビー起動されている場合は、セッションを効率よく管理するために、アプリケーションで DirectPlay との通信チャネルを設定する必要がある。アプリケーションがロビー起動されたかどうかを判断するには、以下の処理を実行する。

  IDirectPlay8LobbiedApplication::Initialize メソッドから復帰する前に、メッセージ ハンドラに DPL_MSGID_CONNECT メッセージが届くことがある。メッセージ ハンドラは、このメッセージを適切に処理する用意ができていなければならない。

アプリケーションがロビー起動されていない場合は、IDirectPlay8LobbiedApplication::SetAppAvailable を呼び出すと、ロビー クライアントからアプリケーションに接続可能であることを示すことができる。このメソッドは、通常、ユーザーがアプリケーションを起動したときに呼び出される。ただし、ユーザーが 1 つのセッションを閉じたが、アプリケーションがまだ動作していて、別のセッションで利用可能な場合にも、このメソッドを使用することができる。どちらの場合も、ロビー クライアントがアプリケーションをセッションに接続すると、メッセージ ハンドラに DPL_MSGID_CONNECT メッセージが届く。

次のサンプル コードは、ロビー対象アプリケーションの初期化方法、およびアプリケーションがロビー起動されているかどうかを判断する方法を示している。これは、SDK の SimplePeer アプリケーションで使用される InitDirectPlay 関数を簡略化したものである。完全なコードについては、上記サンプル アプリケーションを参照すること。わかりやすくするため、主にエラー処理コードが削除されている。g_bWasLobbyLaunched はグローバル変数であり、アプリケーションがロビー起動されている場合に TRUE に設定される。

HRESULT InitDirectPlay()
{
  DPNHANDLE hLobbyLaunchedConnection = NULL;
  HRESULT hr;

  // IDirectPlay8LobbiedApplication を作成する。
  hr = CoCreateInstance( CLSID_DirectPlay8LobbiedApplication, NULL, 
                         CLSCTX_INPROC_SERVER,
                         IID_IDirectPlay8LobbiedApplication, 
                         (LPVOID*) &g_pLobbiedApp );

  // IDirectPlay8LobbiedApplication を初期化する。
  hr = g_pLobbiedApp->Initialize( NULL,
                                  DirectPlayLobbyMessageHandler, 
                                  &hLobbyLaunchedConnection,
                                  0 );
  //有効な接続ハンドルがないか調べる。NULL でない場合
  //アプリケーションはロビー起動されている。
  g_bWasLobbyLaunched = ( hLobbyLaunchedConnection != NULL );

  return S_OK;
}