CreateFile()返回INVALID_HANDLE_VALUE(C++)

Ale*_*hin 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序始终打印"INVALID_HANDLE_VALUE".为什么?文件C:\test2.wav存在.

joh*_*ohn 6

你误解了铸造是如何工作的.你对编译器说的是假装FileName是一个宽字符串,但不是这样你的代码失败了.两种解决方案

1)使用正确的字符串(在你的情况下宽字符串)

LPTSTR FileName;
FileName = _T("c:\\test2.wav");
hFile = CreateFile(FileName, GENERIC_READ, 0 , 0,
    OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
Run Code Online (Sandbox Code Playgroud)

2)使用需要窄字符串的CreateFile版本(称为CreateFileA)

LPSTR FileName;
FileName = "c:\\test2.wav";
hFile = CreateFileA(FileName, GENERIC_READ, 0 , 0,
    OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
Run Code Online (Sandbox Code Playgroud)

这是新手代码的一个共同特征,它已经遍布各地.尽量避免投射,因为它通常只是隐藏错误(就像你的演员一样).如果您不了解强制转换的工作方式,则尤其如此.不幸的是,没有一定数量的演员阵容就不可能进行Windows编程.