Platform SDK: DirectX

システム メッセージの使用

[C++]

IDirectPlay4::Receive メソッドによって DPID_SYSMSG というプレーヤー ID から返されるメッセージは、システム メッセージである。すべてのシステム メッセージは、dwType の値によって指定される識別子から始まる。IDirectPlay4::Receive メソッドによって返されるバッファを汎用メッセージ (DPMSG_GENERIC) にキャストし、dwType 要素を調べることができる。この要素は、DPSYS_ という接頭辞の付くメッセージ タイプ識別子のいずれかに等しい値を持つ。アプリケーションでシステム メッセージの種類を判断したら、バッファを適切な構造体 (接頭辞 DPMSG_ で始まる) にキャストして、データを読み取る。

アプリケーションでは、以下のシステム メッセージを処理できるようにしておく必要がある。

dwType の値 メッセージ構造体 原因
DPSYS
_ADDGROUPTOGROUP
DPMSG_ADDGROUPTOGROUP 既存のグループに既存のグループが追加された。
DPSYS
_ADDPLAYERTOGROUP
DPMSG_ADDPLAYERTOGROUP 既存のグループに既存のプレーヤーが追加された。
DPSYS_CHAT DPMSG_CHAT チャット メッセージが届いた。
DPSYS
_CREATEPLAYERORGROUP
DPMSG_CREATEPLAYERORGROUP 新しいプレーヤーまたはグループが作成された。
DPSYS
_DELETEGROUPFROMGROUP
DPMSG_DELETEGROUPFROMGROUP グループがグループから削除された。
DPSYS
_DELETEPLAYERFROMGROUP
DPMSG_DELETEPLAYERFROMGROUP プレーヤーがグループから削除された。
DPSYS
_DESTROYPLAYERORGROUP
DPMSG_DESTROYPLAYERORGROUP 既存のプレーヤーまたはグループが破棄された。
DPSYS_HOST DPMSG_HOST 現在のホストセッションを離れ、このアプリケーションが新しいホストになった。
DPSYS
_SECUREMESSAGE
DPMSG_SECUREMESSAGE デジタル署名または暗号化が施されたメッセージが届いた。
DPSYS
_SENDCOMPLETE
DPMSG_SENDCOMPLETE 非同期送信が完了した。
DPSYS
_SESSIONLOST
DPMSG_SESSIONLOST セッションの接続が失われた。
DPSYS
_SETGROUPOWNER
DPMSG_SETGROUPOWNER グループの所有者が変更された。
DPSYS
_SETPLAYERORGROUPDATA
DPMSG_SETPLAYERORGROUPDATA プレーヤーまたはグループのデータが変更された。
DPSYS
_SETPLAYERORGROUPNAME
DPMSG_SETPLAYERORGROUPNAME プレーヤーまたはグループの名前が変更された。
DPSYS
_SETSESSIONDESC
DPMSG_SETSESSIONDESC セッション記述が変更された。
DPSYS
_STARTSESSION
DPMSG_STARTSESSION ロビー サーバーが、セッションを開始するように要求している。

[Visual Basic]

DirectPlay4.Receive メソッドによって返され、プレーヤー ID DPID_SYSMSG からのものであるとマークされているメッセージは、システム メッセージである。すべてのシステム メッセージは、Long という型識別子から始まる。

システム メッセージを解析するには、最初に DirectPlayMessage.ReadLong メソッドを使用して、その型識別子を取得する必要がある。次に、DirectPlayMessage のさまざまな読み取りメソッドを使用して、メッセージ データの要素を取り出す。要素は、メッセージ タイプに記載されているのと同じ順序で取り出す必要がある (「CONST_DPSYSMSGTYPES」を参照)。

プレーヤー メッセージとシステム メッセージに使用される標準の読み取りメソッドに加えて、DirectPlay はシステム メッセージを解析するための以下のメソッドを提供する。

ReadSysChatStringReadSysMsgConnection、および ReadSysMsgSessionDesc は、読み取りポインタの位置に関係なく呼び出すことができる。また、これらのメソッドを呼び出しても、読み取りポインタは進まない。一方、ReadSysMsgData を呼び出せるのは、メッセージ内の前のデータがすべて取り出されている場合だけである。また、このメソッドを呼び出すと、読み出しポインタが進む。これは、最初の 3 つのメソッドは使用するデータの基盤となるメッセージ構造体内での場所を常に把握しているが、ReadSysMsgData を使用すると、異なるメッセージ タイプの異なる場所からデータを取り出すことができるからである。