Я пытаюсь выполнить «предполетные проверки», проверяя «открываемость» 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» - это проверенная и проверенная функция, которая сама по себе работает правильно. Сбой происходит только при вызове сразу после более ранних вызовов CreateFile / CloseHandle, когда второй CreateFile возвращает E_ACCESSDENIED.
Хуже того, если я медленно перебираю код в отладчике, он работает просто отлично.
Кажется, мне нужно Sleep () после первого closeHandle, но это похоже на хак - и я не могу понять, как долго это должно быть.