Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CreateFile()返回无效的句柄值(C+;+;)_C++_C_Winapi - Fatal编程技术网

C++ CreateFile()返回无效的句柄值(C+;+;)

C++ CreateFile()返回无效的句柄值(C+;+;),c++,c,winapi,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) {

考虑:

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;
    }
}
void main()
{
LPSTR文件名;
FileName=“C:\\test2.wav”;
hFile=CreateFile((LPCWSTR)文件名,一般读取,0,0,
打开\u现有,文件\u属性\u存档,0);
if(hFile==无效的句柄值)
{

cout您不能将多字节/ASCII/UTF-8字符串强制转换为宽/UTF-16字符串。您实际上必须将其转换。尝试使用转换它。其他关于不同版本的
CreateFile
的答案可能最简单,但如果您真的需要宽字符串,这可能很有用。

您不能只需将一个多字节/ASCII/UTF-8字符串转换为宽/UTF-16字符串。您实际上必须转换它。尝试使用转换它。其他关于
CreateFile
不同版本的答案可能最简单,但如果您确实需要宽字符串,这可能会很有用。

您误解了如何转换ing是有效的。你对编译器说的是假装文件名是一个宽字符串,但事实并非如此,所以你的代码失败了。两种解决方案

1) 使用正确类型的字符串(在您的情况下是宽字符串)

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

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

这是新手代码的一个常见特性,它到处都有强制转换。尽量避免强制转换,因为它通常只是隐藏错误(就像你的强制转换一样)。如果您不了解强制转换是如何工作的,则尤其如此。不幸的是,如果没有一定数量的强制转换,则不可能执行Windows编程。

您误解了强制转换的工作方式。您对编译器说的是假装文件名是宽字符串,但事实并非如此,因此您的代码失败。两种解决方案

1) 使用正确类型的字符串(在您的情况下是宽字符串)

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

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

这是新手代码的一个常见特性,它到处都有强制转换。尽量避免强制转换,因为它通常只是隐藏错误(就像你的强制转换一样)。如果您不了解强制转换是如何工作的,则尤其如此。不幸的是,如果没有一定数量的强制转换,则不可能执行Windows编程。

将字符串强制转换为宽字符串不起作用!更准确地说,将
LPSTR
强制转换为
LPWSTR
不起作用。将字符串强制转换为宽字符串不起作用!更多信息:通常,将
LPSTR
强制转换为
LPWSTR
不起作用。