Platform SDK: DirectX

チュートリアル 3 : サービス プロバイダ ダイアログの書き換え

[Visual Basic]

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

[C++]

アプリケーションで DirectPlay を使うとき、サービス プロバイダの標準のダイアログを隠蔽できるようになった。以下に、そのための方法を簡単に示す。コード例は、Override サンプル アプリケーションにある。

一般に、サービス プロバイダのダイアログをすべて隠蔽するのは不可能である。標準の TCP/IP、モデム、およびシリアル サービス プロバイダのダイアログは隠蔽することが可能である (IPX にはダイアログ ボックスは存在ない)。しかし、サード パーティのサービス プロバイダがユーザーからの比較的複雑な情報を必要としていて、それを一般的な方法で書き換えられない場合がある。この問題に対する解決策は、それらのダイアログ ボックスをアプリケーションのユーザー インターフェイスで表示することである。アプリケーションが DirectDraw® のフルスクリーン アプリケーションの場合、IDirectPlay4::EnumSessions または IDirectPlay4::Open を呼び出してセッションを作成する前に、ページ フリッピングをオフにしておく必要がある。

サービス プロバイダのダイアログ ボックスを隠蔽するためのもう 1 つの方法は、アプリケーションをロビーに対応させることである。サード パーティのサービス プロバイダのほとんどは、ゲームを起動するためのロビーも用意している。ロビーから起動されたゲームは、接続のダイアログ ボックスを表示しない。

アプリケーションでは、最初に IDirectPlay4::EnumConnections を呼び出して利用可能な接続を確認し、それらの接続のリストを提供し、ユーザーに接続を選択させる。ユーザーが接続を選択したら、IDirectPlay4::EnumSessions または IDirectPlay4::Open を呼び出す前に、ダイアログ ボックスの書き換えを試みる。

サービス プロバイダのダイアログ ボックスを書き換えるためのステップは次のとおりである。

選択されたサービス プロバイダのサービス プロバイダ GUID を調べて、それがアプリケーションが書き換え方法を把握している既知のサービス プロバイダのいずれかと一致するかどうかを確認する。サービス プロバイダ GUID が既知のものでない場合は、以下のステップをとばして、ダイアログ ボックスの表示を許可する。

特定のサービス プロバイダに必要な情報をユーザーから収集するための適切なユーザー インターフェイスを表示する。IPX の場合は、情報は不要である。TCP/IP の場合は、EnumSessions に対する IP アドレス (DPAID_INet または DPAID_INetW) が必要だが、Open を使用してセッションを作成するために必要なものはない。モデム ツー モデムの場合は、ユーザーがモデム (DPAID_Modem または DPAID_ModemW) を選択するだけでなく、EnumSessions を呼び出すときに電話番号 (DPAID_Phone または DPAID_PhoneW) も必要である。シリアル リンクの場合は、EnumSessionsOpen に対してCOM ポートを構成するために、DPCOMPORTADDRESS 構造体 (DPAID_ComPort) にデータを代入する必要がある。

IDirectPlayLobby3::CreateCompoundAddress メソッドを使用して、DirectPlay アドレス を作成する。渡す必要のあるアドレス要素は、サービス プロバイダ GUID (DPAID_ServiceProvider) と、選択されたサービス プロバイダの個別のアドレス コンポーネントである。

DirectPlay アドレス を使用して InitializeConnection を呼び出し、DirectPlay オブジェクトを初期化する。

DPENUMSESSIONS_RETURNSTATUS フラグを設定して EnumSessions を呼び出す。これにより、あらゆるステータス ダイアログ ボックスが表示されなくなる。接続をすぐに実行できない場合、EnumSessions は DPERR_CONNECTING エラーを返す。アプリケーションでは、DP_OK が返される (列挙に成功したことを意味する) か、またはその他のエラーが返される (呼び出しに失敗したことを意味する) まで、EnumSessions を定期的に呼び出す必要がある。

Open メソッドで DPOPEN_CREATE を使用してセッションを作成する場合は、DPOPEN_RETURNSTATUS フラグも指定する。DPENUMSESSIONS_RETURNSTATUS と同じく、このフラグによってステータス ダイアログ ボックスが隠蔽され、関数が完了するまで DPERR_CONNECTING が返される。

 :  場合によっては、アプリケーションで実行時にサービス プロバイダを問い合わせて、特定の DirectPlay アドレス 要素に対する有効な選択肢のリストを取得しなければならない場合もある。たとえば、システムにインストールされているモデムのリストを取得する場合などである。この場合、アプリケーションでは別の DirectPlay オブジェクトを作成し、モデム サービス プロバイダを初期化してから、DirectPlay ID にゼロを設定して IDirectPlay4::GetPlayerAddress を呼び出し、モデムのリストを保持する DirectPlay アドレス を取得する必要がある。DirectPlay オブジェクトを解放したら、IDirectPlayLobby3::EnumAddress を使ってアドレスを解析し、モデム リストを抽出してユーザーに提示する必要がある。