我正在尝试通过在启动允许用户执行通信操作的对话框窗口之前测试 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。
更糟糕的是,如果我在调试器中慢慢地单步调试代码,它工作得很好。
在第一个 closeHandle 之后,我似乎需要一个 Sleep(),但这感觉就像一个 hack - 我无法知道它必须多长时间。