Platform SDK: DirectX |
ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectPlay Visual Basic チュートリアル」を参照すること。
ユーザーが既存のセッションへの参加を求めている場合は、IDirectPlay4::EnumSessions メソッドを使用して利用可能なセッションを列挙し、ユーザーに選択肢を示す。次に、DPOPEN_JOIN フラグを設定して IDirectPlay4::Open メソッドを呼び出し、セッションに接続する。セッションを列挙する前に、サービス プロバイダによってユーザーに情報を要求するダイアログ ボックスが表示される場合もある。
非同期の EnumSessions 機能に関する詳細については、「チュートリアル 4 : 自動リフレッシュ式セッション リストの作成」を参照すること。
次の例は、利用可能なセッションを列挙する方法を示している。
// セッションを列挙し、DirectPlay にタイムアウトを判断させる。 ZeroMemory( &dpsd, sizeof(dpsd) ); dpsd.dwSize = sizeof(dpsd); dpsd.guidApplication = g_AppGUID; // 選択された接続で、アクティブな DirectPlay ゲームを // すべて列挙する。 hr = g_pDP->EnumSessions( &dpsd, 0, DPConnect_EnumSessionsCallback, NULL, DPENUMSESSIONS_ALL | DPENUMSESSIONS_ASYNC );
IDirectPlay4::EnumSessions メソッドの 3 番目のパラメータは、利用可能なセッションを列挙するコールバックである。次のコードは、SimpleConnect サンプル におけるこのコールバック関数の実装方法を示している。
BOOL FAR PASCAL DPConnect_EnumSessionsCallback( LPCDPSESSIONDESC2 pdpsd, DWORD* pdwTimeout, DWORD dwFlags, VOID* pvContext ) { DPSessionInfo* pDPSINew = NULL; if ( dwFlags & DPESC_TIMEDOUT ) return FALSE; // タイムアウト。列挙を中止する。 // 適切なセッションが見つかった。これを保存する。 pDPSINew = new DPSessionInfo; if ( NULL == pDPSINew ) return FALSE; ZeroMemory( pDPSINew, sizeof(DPSessionInfo) ); // 情報を pDPSINew にコピーする。 pDPSINew->guidSession = pdpsd->guidInstance; sprintf( pDPSINew->szSession, "%s (%d/%d)", pdpsd->lpszSessionNameA, pdpsd->dwCurrentPlayers, pdpsd->dwMaxPlayers ); // pDPSINew を循環型のリンク リスト g_pDPSIFirst に追加する。 pDPSINew->pDPSINext = g_DPSIHead.pDPSINext; g_DPSIHead.pDPSINext = pDPSINew; return TRUE; }
ユーザーがセッションを選択したら、アプリケーションでは既存のセッションへの参加を許可することができる。次の例は、既存のセッションへ参加する方法を示している。
// DPSESSIONDESC2 を設定し、リストボックスの選択された項目から // セッションの GUID を取得する。 ZeroMemory( &dpsd, sizeof(dpsd) ); dpsd.dwSize = sizeof(dpsd); dpsd.guidInstance = pDPSISelected->guidSession; dpsd.guidApplication = g_AppGUID; // セッションに参加する。 g_bHostPlayer = FALSE; if ( FAILED( hr = g_pDP->Open( &dpsd, DPOPEN_JOIN ) ) ) return hr;
次項 : ステップ 4 : セッションの作成