1

ユーザーがcom-portyを実行できるダイアログウィンドウを起動する前に、COMポートの「オープン性」をテストして「飛行前チェック」を実行しようとしています。

アウトラインのコードシーケンスは次のとおりです。

handle = CreateFile("\\\\.\\COM4:", GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);

if (handle != INVALID_HANDLE_VALUE)
{
  CloseHandle(handle);
  DoTheWork("\\\\.\\COM4:");
}
else
{ 
  ShowMessage("I'm sorry Dave, I can't do that"); 
} 

...

void DoTheWork(char * port)
{
  handle = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);
  /// do lots of stuff
  CloseHandle(port);
}

問題は次のとおりです。「DoTheWork」は試行錯誤された関数であり、それ自体で正しく機能します。2番目のCreateFileがE_ACCESSDENIEDを返すときに、以前のCreateFile/CloseHandle呼び出しの直後に呼び出された場合にのみ失敗します。

さらに悪いことに、デバッガーでコードをゆっくりとステップ実行すると、問題なく動作します。

最初のcloseHandleの後にSleep()が必要なようですが、それはハックのように感じます-そして、それがどれくらいの長さでなければならないかを知る方法がありません。

4

3 に答える 3

1

ハンドルを閉じる前に、ハンドルで PurgeComm() または FlushFileBuffers() を呼び出してみてください。

于 2009-08-20T17:31:44.053 に答える
0

さて、さらにトロールした後、私はこれを見つけました。これは、Win32ではなくWindowsCEに関連しています。

CloseHandleが呼び出されてから、ポートが閉じられてリソースが解放されるまでに2秒の遅延があります。

同じことがWin32にも当てはまると思いますが、文書化された証拠は見つかりませんでした。

于 2009-08-20T16:32:35.280 に答える