ユーザーが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()が必要なようですが、それはハックのように感じます-そして、それがどれくらいの長さでなければならないかを知る方法がありません。