Platform SDK: DirectX

ステップ 3 : セッションへの参加

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectPlay Visual Basic チュートリアル」を参照すること。

[C++]

ユーザーが既存のセッションへの参加を求めている場合は、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 : セッションの作成