CreateFile() returns INVALID_HANDLE_VALUE (C++)

CreateFile() returns INVALID_HANDLE_VALUE (C++)

本文关键字:VALUE C++ HANDLE INVALID returns CreateFile      更新时间:2023-10-16

考虑:

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的其他答案可能是最简单的,但以防万一您实际上需要宽字符串,了解这一点可能很有用。