考虑:
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
存在。
答案 0 :(得分:6)
你误解了投射是如何运作的。你对编译器说的是假装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编程。
答案 1 :(得分:1)
您不能只将多字节/ ASCII / UTF-8字符串转换为宽/ UTF-16字符串。你实际上必须转换它。尝试使用MultiByteToWideChar()
进行转换。讨论CreateFile
的不同版本的其他答案可能是最简单的,但是如果您确实需要宽字符串,这可能对您有用。