Windows Embedded Compact 7 ベースのデバイスで RasDial 関数が失敗し続けることがあります

適用対象: Windows Embedded Compact 7

現象


Windows Embedded Compact 7 (以下、WEC7) ベースのデバイスにて、アプリケーションから RasDial 関数を使ってダイヤルアップ接続を試みたとき、関数がエラーを返し続ける場合があります。このときのエラーコードは、633 (ERROR_PORT_NOT_AVAILABLE:モデムまたは他の接続デバイス は既に使用中か、正しく構成されていません) です。
この現象は、次のような処理を行った後に、再度 RasDial 関数を呼び出すと現象が発生することがあります。
  • RasDial 関数を同期モードで呼び出している
  • 現象発生直前の RasDial 関数の呼び出しが、エラーコード 619 (ERROR_PORT_NOT_OPEN:指定したポートは接続されていません) で失敗し、かつその時 RasDial 関数は、第 6 引数の pRasConn に RAS 接続のハンドルを返している
  • RasDial 関数が返した、RAS 接続のハンドルに対して、アプリケーションが RasHangUp 関数を呼び出している

原因


上述の RasDial 関数がエラーコード619 で失敗するとき、モデム ドライバー (Unimodem.dll) 内部で実施しているクリーンアップ処理と、アプリケーションが呼び出している RasHangUp 関数の呼び出し処理が競合した時に、本現象が発生します。
この競合が発生するとモデム ドライバーの内部フラグが意図しない状態となります。それにより、以降の RasDial 関数の呼び出しがエラーコード 633:ERROR_PORT_NOT_AVAILABLE で失敗し続けます

解決方法


この現象が発生した場合、WEC7 デバイスをリセット(ウォーム リセット)することで、エラーを復旧できます。

回避策


アプリケーションで、この現象を発生させないようにするためには、そのアプリケーションが呼び出している RasHangUp 関数のタイミングを 4 ~ 8 秒程度遅らせるようにします。
モデム ドライバーでは、クリーンアップ処理にてモデムの応答を一定の期間待機しています。そのため、アプリケーションにおいても、一定の期間待機してから RasHangUp 関数の呼び出しを行うことで、モデム ドライバーとの競合を回避できます。

したがって、RasHangUp 関数の呼び出しにおいて、その直前の RasDial 関数の呼び出しにて現象セクションに記載されている条件を満たした場合は、Sleep 関数などを使用し、呼び出しを遅延させ現象を回避してください。

また、RasDial 関数がエラーコード 619 以外の場合でも、以降の RasDial 関数の呼び出しで常に エラーコード 633 が繰り返し返されるような現象となった場合には、この回避方法を試してください。

状況


マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。