Platform SDK: DirectX

ステップ 2 : サービス プロバイダの列挙と初期化

[Visual Basic]

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

[C++]

手動接続を作成するための次のステップは、アプリケーションに対する通信媒体を選択するようにユーザーに要求することである。アプリケーションでは、EnumConnections メソッドを使用して、パーソナル コンピュータにインストールされているサービス プロバイダを識別することができる。

次の例は、サービス プロバイダを列挙する方法を示している。

// DirectPlay 接続をすべて列挙し
// それらをリストボックスに格納する。
if ( FAILED( hr = pDP->EnumConnections( &g_AppGUID, 
        DPConnect_EnumConnectionsCallback, hWndListBox, 0 ) ) )
{
    SAFE_RELEASE( pDP );
    return hr;
}

EnumConnections メソッドの 2 番目のパラメータは、DirectPlay によって登録されたサービス プロバイダを列挙するコールバックである。次の例は、SimpleConnect サンプル におけるこのコールバック関数の実装方法を示している。

BOOL FAR PASCAL DPConnect_EnumConnectionsCallback( 
        LPCGUID   pguidSP,
        VOID*     pConnection,
        DWORD     dwConnectionSize,
        LPCDPNAME pName,
        DWORD     dwFlags,
        VOID*     pvContext )
{
    HRESULT       hr;
    LPDIRECTPLAY4 pDP = NULL;
    VOID*         pConnectionBuffer = NULL;
    HWND          hWndListBox = (HWND)pvContext;
    LRESULT       iIndex;
 
    // IDirectPlay オブジェクトを作成する。
    if ( FAILED( hr = CoCreateInstance( CLSID_DirectPlay, NULL,
            CLSCTX_ALL, IID_IDirectPlay4A, (VOID**)&pDP ) ) )
            return FALSE; // エラー。列挙を中止する。
 
    // 初期化を試みて、接続が利用できるかどうか
    // テストする。
        // 接続。
    if( FAILED( hr = pDP->InitializeConnection( pConnection, 0 ) ) )
    {
        SAFE_RELEASE( pDP );
        return TRUE; // 利用できない接続。列挙を続ける。
    }
 
    // IDirectPlay インターフェイスはこれ以上必要ないので、解放する。
    SAFE_RELEASE( pDP );
 
    // 適切な接続が見つかったので、これをリストボックスに代入する。
    iIndex = SendMessage( hWndListBox, LB_ADDSTRING, 0,
            (LPARAM)pName->lpszShortNameA );
    if( iIndex == CB_ERR )
        return FALSE; // エラー。列挙を中止する。
 
    pConnectionBuffer = new BYTE[ dwConnectionSize ];
    if( pConnectionBuffer == NULL )
        return FALSE; // エラー。列挙を中止する。
 
    // GUID へのポインタをリストボックスに格納する。
    memcpy( pConnectionBuffer, pConnection, dwConnectionSize );
    SendMessage( hWndListBox, LB_SETITEMDATA, iIndex,
            (LPARAM)pConnectionBuffer );
 
    return TRUE; // 列挙を続ける。
}

ユーザーが使用する接続を選択したら、列挙によって返される接続データを取得し、そのデータを使って DirectPlay オブジェクトを初期化する必要がある。

if ( FAILED( hr = g_pDP->InitializeConnection( pConnection, 0 ) ) )
    return hr;

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