ReadFile winapi在从虚拟盒共享文件夹读取时失败.GetLastError正在引发错误183
ReadFile winapi fails on reading from virtual box shared folder. GetLastError is throwing the error 183
我调用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发布的代码与失败的代码不同。
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- ReadFile winapi在从虚拟盒共享文件夹读取时失败.GetLastError正在引发错误183
- InternetQueryOption(.) 失败,GetLastError() 始终返回 122 (ERROR_INS
- Windows GDI上下文-函数失败,GetLastError()返回0
- c++ Win32.SelectObject失败,GetLastError返回错误1400(无效窗口句柄)