ReadFile winapi在从虚拟盒共享文件夹读取时失败.GetLastError正在引发错误183

ReadFile winapi fails on reading from virtual box shared folder. GetLastError is throwing the error 183

本文关键字:GetLastError 失败 错误 文件夹 虚拟 winapi 共享 ReadFile 共享文件 读取      更新时间:2023-10-16

我调用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

有人能帮我解决这个奇怪的错误吗?

首先,您的代码片段有点。。。不稳定。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发布的代码与失败的代码不同。