CreateFile() returns INVALID_HANDLE_VALUE (C++)
CreateFile() returns INVALID_HANDLE_VALUE (C++)
考虑:
void main()
{
LPSTR FileName;
FileName = "C:\test2.wav";
hFile = CreateFile((LPCWSTR)FileName, GENERIC_READ, 0, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
cout << "INVALID_HANDLE_VALUE" << endl;
return;
}
}
该程序始终打印"INVALID_HANDLE_VALUE"。为什么?文件C:test2.wav
存在。
你误解了铸造的工作原理。你对编译器说的是假装文件名是一个宽字符串,但事实并非如此,所以你的代码失败了。两种解决方案
1)使用正确类型的字符串(在您的情况下是宽字符串)
LPTSTR FileName;
FileName = _T("c:\test2.wav");
hFile = CreateFile(FileName, GENERIC_READ, 0 , 0,
OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
2) 使用需要窄字符串的 CreateFile 版本(称为 CreateFileA)
LPSTR FileName;
FileName = "c:\test2.wav";
hFile = CreateFileA(FileName, GENERIC_READ, 0 , 0,
OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
这是新手代码的一个共同特征,它到处都是转换。尽量避免投射,因为它通常只会隐藏错误(就像你的投射一样)。如果您不了解强制转换的工作原理,则尤其如此。不幸的是,如果没有一定数量的强制转换,就不可能进行 Windows 编程。
您不能只将多字节/ASCII/UTF-8 字符串转换为宽/UTF-16 字符串。你实际上必须转换它。尝试使用MultiByteToWideChar()
进行转换。谈论不同版本的CreateFile
的其他答案可能是最简单的,但以防万一您实际上需要宽字符串,了解这一点可能很有用。
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- 为什么我会" void value not ignored as it ought to be"?
- 方法错误"not all control paths return a value"和方法不返回值
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- std::<key-value>不同类型的对向量
- c++ visual studio 64bit | save registers value
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 如何解决类成员函数中的"return a value"错误?
- bsoncxx: document::view vs document::value
- .value( "key" , default) 不适用于空的 json 对象吗?
- 如何在C++中设置演员的"Render Custom Depth Pass"和"Depth Stencil Value"?
- Qt 错误:QSqlQuery::value:尝试从表中检索统计信息时未定位在有效记录上 (QComboBox)
- 马洛克会在 C++17 年返回"invalid pointer value"吗?
- 如何将 v8::FunctionCallbackInfo<v8::Value> 数组从一个隔离复制到另一个隔离?
- std::value templated 方法的函数使用 clang 和 g++ 进行编译,但不使用 msvc 进行编译
- 无法使用 auto 来参数化true_type来检测 T::value()
- 为什么使用 "++value"会导致 -842150449?
- 为什么 std::is_error_code_enum<std::errc>::value 为假?