Microsoft DirectX 8.0 (C++)

DirectPlay 列挙の実装

多くの Microsoft® DirectPlay® 列挙は、適切な列挙メソッドを呼び出し、返されるデータ配列を調べる、という標準パターンに従う。ホストの列挙は、このパターンに従わないので別に説明する。

データを取得するメソッドを呼び出す前に、返されるデータ ブロックを格納できるメモリを割り当てておく必要がある。ただし、事前には必要な配列の大きさがわからないことが多い。考えられるあらゆる配列を格納できるブロックを割り当てればよいが、効率的な方法ではない。代わりに、DirectPlay では、必要な配列サイズを照会してから、照会を繰り返して構造体自体を取得できる。

次の手順は、ピアツーピア ゲームのグループのメンバを列挙する方法の概要である。ホストの列挙を除き、ほかの種類の列挙もすべて同様の一般手順に従って行われる。列挙は、変化する情報のスナップショットを取得するために使用されることが多いため、ループ内で成功するまで実行しなければならない。

  1. IDirectPlay8Peer::EnumGroupMembers を呼び出す。このメソッドは、個々のグループ メンバの ID が入った整数配列を、prgdpnid パラメータに返す。pcdpnid パラメータは配列の要素数を指示するために使用する。適切な値を要求するには、pcdpnid パラメータを 0 に設定する。prgdpnid は NULL に設定する。
  2. メソッドから復帰したとき、pcdpnid は配列に格納される要素の数を指す。
  3. pcdpnid に返された値を使って使用する配列を割り当て、その配列を prgdpnid パラメータに割り当てる。
  4. pcdpnid を最初のメソッド呼び出しで返された値に設定する。
  5. もう一度 IDirectPlay8Peer::EnumGroupMembers を呼び出す。
  6. メソッドから再度復帰したら、戻り値を確認する。成功した場合、メソッドは S_OK を返し、配列にプレーヤーの ID が格納される。
  7. メソッドが再度 DPNERR_BUFFERTOOSMALL を返す場合は、直前の呼び出し以降にプレーヤー数が増えたことを示す。ステップ 3. に戻り、新しい pcdpnid 値を使って配列サイズを増やす。メモリ リークが起きないように注意すること。

メソッドが構造体の配列を返す場合もある。その場合、手順は同じだが、最初のメソッド呼び出しで返される値は、配列の要素数でなく、バイト数で表した配列サイズである。詳細については、各メソッドのリファレンスを参照すること。

詳細については、「ホストの列挙」を参照すること。