CreateFile()返回INVALID_HANDLE_VALUE(C ++)

时间:2012-10-10 06:59:20

标签: c++ c winapi

考虑:

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

2 个答案:

答案 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的不同版本的其他答案可能是最简单的,但是如果您确实需要宽字符串,这可能对您有用。