考虑:

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

最佳答案

您误解了投射的工作方式。您对编译器所说的是假装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编程。

关于c++ - CreateFile()返回INVALID_HANDLE_VALUE(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12813677/

10-11 21:59