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
不起作用。