Platform SDK: DirectX

モデムツーモデム

モデムツーモデム サービス プロバイダは、テレフォニー API (TAPI) を使用してほかのモデムと通信する。このサービス プロバイダは、非保証メッセージングだけをサポートする。モデム セッションで保証メッセージングを実行するには、DirectPlay プロトコルを使用する。

セッションを作成すると、ダイアログ ボックスが表示される。ユーザーはモデムとその設定を選択してから、モデムを自動応答モードに設定する。セッションを列挙した場合もダイアログ ボックスが表示され、電話番号と使用するモデムがたずねられる。情報が入力されると、DirectPlay はモデムにダイヤルし、先方のコンピュータがホストしているセッションを検索する。

[C++]

ダイアログ ボックスを表示せずにモデム セッションを列挙するには (たとえば、アプリケーションが電話番号を把握していて、IDirectPlay4::InitializeConnection が呼び出されたときにその電話番号がサービス プロバイダに渡されていた場合)、DPENUMSESSIONS_RETURNSTATUS フラグを設定せずに IDirectPlay4::EnumSessions をループで使用する (詳細については、EnumSessions を参照)。DP_OK が返された場合、アプリケーションは EnumSessions をもう一度使用して実際のセッションのリストを取得する必要がある。

このようにして EnumSessions をループで使用する場合、アプリケーションではウィンドウ メッセージのループを次のように実装する必要がある。

while (lpDPLAY->EnumSessions(lpsd, 0, lpEnumSessionsCallback,
        lpContext, DPENUMSESSIONS_RETURNSTATUS) == DPERR_CONNECTING)
{
    MSG    msg;

    if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    Sleep(500);
}

メッセージ処理に挿入する遅延時間が長すぎると、パケットを失う場合がある。たとえば、大量のデバッグ情報を出力する場合などに、こうしたことが起こる可能性がある。

利用可能なモデムの最新のリストをサービス プロバイダから取得するには、そのサービス プロバイダを初期化し、プレーヤー ID にゼロを指定して IDirectPlay4::GetPlayerAddress メソッドを呼び出す。返される DirectPlay アドレスには、ANSI のモデム名 (DPAID_Modem) と Unicode のモデム名 (DPAID_ModemW) が含まれている。モデムのリストは、null で終わる一連の文字列で、リストの最後に長さゼロの文字列が含まれている。詳細については、「DirectPlay アドレスのデータ型」を参照すること。

[Visual Basic]

ダイアログ ボックスを表示せずにモデム セッションを列挙するには (たとえば、アプリケーションが電話番号を把握していて、DirectPlay4.InitializeConnection が呼び出されたときにその電話番号がサービス プロバイダに渡されていた場合)、DPERR_CONNECTING エラーが発生しなくなるまで、DPENUMSESSIONS_RETURNSTATUS フラグを設定して DirectPlay4.GetDPEnumSessions を繰り返し呼び出す。ループの実行中にイベントを処理できるようにする必要がある。これを行う方法の一例を次のサンプル コードに示す。

' objDPlay は DirectPlay4 オブジェクト。
' SessionData は、有効な情報を含む DirectPlaySessionData オブジェクト。

On Error GoTo DO_AGAIN
Do While DoEvents
    objDPlay.GetDPEnumSessions(SessionData, 0, _
          DPENUMSESSIONS_AVAILABLE Or DPENUMSESSIONS_RETURNSTATUS)
    Exit Do    ' エラーなし。列挙完了。
DO_AGAIN:
    ' ほかのエラーの場合は、あきらめる。
    if Err.Number <> DPERR_CONNECTING Then 
        ' エラーを処理する - セッションを列挙できない。
        Exit Do
    End If
    ' まだ接続しているので、再度試みる。
Loop
On Error GoTo 0

利用可能なモデムの名前をサービス プロバイダから取得するには、そのサービス プロバイダを初期化し、インデックス値 1 から DirectPlayLobby3.GetModemCount によって返される値までに対して、DirectPlayLobby3.GetModemName メソッドを呼び出す。

モデムツーモデム サービス プロバイダの GUID は、DPSPGUID_MODEM と指定することができる。