考虑:
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
存在。 最佳答案
您误解了投射的工作方式。您对编译器所说的是假装FileName是一个宽字符串,但并不是这样,因此您的代码会失败。两种解决方案
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编程。
关于c++ - CreateFile()返回INVALID_HANDLE_VALUE(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12813677/