Last Updated 2002/03/02
Programming Tips Windows COMMポート  索 引 
通信APIのハングアップ
2002/03/02

通信APIがハング


VisualStudio97 の CD-ROM1枚目 \devstudio\vc\samples\sdk\win32\comm のサンプルの疑問.

このサンプルでは CreateFile で OVERLAPPED を指定していて,ReadFile と WriteFile にも OVERLAPPED を指定しているが,WaitCommEvent には OVERLAPPED を指定していない.
これでも問題なく動いているようだが,オンラインヘルプの WaitCommEvent には,

If hFile was opened with FILE_FLAG_OVERLAPPED,
the lpOverlapped parameter must not be NULL.
It must point to a valid OVERLAPPED structure.
If hFile was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL,
the function can incorrectly report that the operation is complete.

と書いてあり,このサンプルは API の仕様に反することをやっているようだ.

それで不安になったので「Windows95通信プログラミング」の Ex3-4 を参考にしたら.....
(こちらはOVERLAPPEDの指定は全て無し)



Windows95通信プログラミング(アスキー)のサンプルプログラムの
\Chapter3\Ex3-4\Code34.exe
にて,メニューの [Settings]-[Configure] を実行するとハングアップする.
また,単に何かキーを押す(送信する)だけでもハングアップする.

調べてみると,GetCommConfig 及び WriteFile でハングアップしているようだ.

この現象は NT4.0 では起きるが 95 では起きない.

WaitCommEvent でイベント待ちの状態で何か通信 API をコールしたときにハングアップするようだ.
WaitCommEvent を使わなければ同じ API でもハングアップしない.




TAPIでは,通信ハンドルを非同期で開く.
(モデムのネゴシエーションが確立しコネクトした後の得られるハンドル)
従って,WriteFile(), ReadFile() の最後の引数を NULL にするのは,正当ではない.Windows95 では、最後の引数を NULL であたかも同期の様に動作するが,NT では失敗におわる.


OVERLAPPED overlapped  = {0, 0, 0, 0, NULL};
WriteFile(hComm, 
          byData,
          ulDataNum,
          &dwNumOfBytesWritten,
          &overlapped);
GetOverlappedResult(hComm,
                    &overlapped, 
                    &dwNumOfBytesWritten,
                    TRUE);

上記の様にするとあたかも同期動作の様に振る舞える.


VisualStudio97のサンプル
\devstudio\vc\samples\sdk\win32\tapi\tapicomm
がかなり参考になりそう.


参照
前後のTips
通信APIのハングアップ

DSS ProgrammingTipsCGI Ver2.02