我正在调用ReadFile winapi函数来从virtualbox shated文件夹中读取一些数据。 ReadFile失败。 GetLastError抛出183错误代码'当该文件已存在时无法创建文件'。 有时它发生在vmware共享文件夹上。
我的代码示例
bool ret = ReadFile(hFile, buf, size, &bytesRead, nullptr);
if (ret == FALSE)
{
logger << L"err: " + ToString(GetLastError());
}
//out:
//err: 183
任何人都可以帮我解决奇怪的错误吗?
答案 0 :(得分:-1)
首先,你的代码片段有点......不稳定。 ReadFile返回一个BOOL(一种Microsoft定义的类型,它存在于C之前的'bool'之前)。然后,您将其分配给C风格的bool,然后将该bool与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发布的代码与失败的代码不同。