1

考虑:

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存在。

4

2 回答 2

8

您误解了铸造的工作原理。您对编译器说的是假装 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 编程。

于 2012-10-10T07:04:50.020 回答
1

您不能只将多字节/ASCII/UTF-8 字符串转换为宽/UTF-16 字符串。你实际上必须转换它。尝试使用MultiByteToWideChar()转换它。谈论不同版本的其他答案CreateFile可能是最简单的,但以防万一您确实需要宽字符串,这可能很有用。

于 2012-10-10T07:04:17.010 回答