首先,您的代码片段有点……不可靠。ReadFile 返回一个 BOOL(一种 Microsoft 定义的类型,存在于 C 有“bool”之前的日子)。然后将其分配给 C 风格的布尔值,然后将该布尔值与 MS 常量“FALSE”进行比较。正如所写的那样,它并没有错,但是不必要地在各种形式的布尔值之间切换是一个坏主意,因为它往往会使更难看到测试的实际意义。
其次,我怀疑这段代码并不完全是失败的代码!
我这样说是因为我可以通过简单地反转 ReadFile 上的测试意义来产生所描述的行为。也就是说,如果您在 ReadFile 返回 true 时检查 GetLastError,它将(在我的机器上,今天,在读取串行端口时)给出错误 183!因此,我怀疑在实际代码中,OP 实际上以某种方式掩盖了布尔测试(就像我在当天早些时候所做的那样),从而导致了明显的虚假 ReadFile 错误。
我对此的解决方案是尽可能简单地重写测试,使用尽可能少的布尔值形式,以便最大程度地避免测试失败。
如果您将代码更改为此(假设您实际上不需要其他地方的 ReadFile 返回值):
if (!ReadFile(hFile, buf, size, &bytesRead, nullptr))
{
DWORD err = GetLastError();
logger << L"err: " + ToString(err);
}
该代码可以很容易地看出所讨论的测试的意义,并减少了编写错误测试的可能性。
如果您确实需要保留“ret”,请执行以下操作:
BOOL ret = ReadFile(hFile, buf, size, &bytesRead, nullptr);
if (!ret)
{
DWORD err = GetLastError();
logger << L"err: " + ToString(err);
}
在这两种情况下,您都会注意到我从日志行中提取了 GetLastError 调用。这是为了确保在调用 ReadFile 和调用 GetLastError 之间不会发生任何事情。
编辑:修改以澄清我的意见。原始版本没有说明我认为 OP 发布的代码与失败的代码不同。