尝试执行任何需要它时无法修复 WinAPI 中的 "invalid handle" 错误
Cannot fix an "invalid handle" error in WinAPI when trying to do anything requiring it
我正在尝试使用 WinAPI 来操作控制台,主要是能够随时随地编写我想要的任何内容,而无需重写整个控制台。我记得我曾经让它工作过,但那是很久以前的事了,我似乎忘记了那个代码……哎呀。
无论如何,我记得,我比现在付出的努力少得多。
我正在使用 this MS Docs page 作为参考,我记得以前使用过它,成功了。
现在,我真正要开始工作的只有几行:
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
HANDLE hndl = GetStdHandle(STD_INPUT_HANDLE);
if (hndl == INVALID_HANDLE_VALUE)
{
cout << "Invalid handle, error " << GetLastError();
return 0;
}
long unsigned int *chars_written = new long unsigned int;
if (!WriteConsoleOutputCharacter(hndl, "mystring", 8, {20, 30}, chars_written))
{
cout << "Could not write, error " << GetLastError();
return 0;
}
return 0;
}
结果是控制台 window 显示 "Could not write, error 6" 然后结束应用程序。
错误6,根据System Error Codes是"the handle is invalid"。
我做错了什么?我一定是漏掉了什么。
我尝试在 Code::Blocks 工作似乎很重要。
奖励:我在 MS Visual Studio 中尝试了完整的 WinAPI SDK(Code::Blocks 中似乎缺少一些重要部分),虽然主要问题是相同的,但 MS Visual Studio 似乎并不完全符合我使用的官方参考资料,例如WriteConsoleOutputCharacter requires an LPCWSTR as its 2nd argument instead of a LPCSTR as mentioned in the source and as works in Code::Blocks. Windows Data Types
编辑:我发现 WriteConsoleOutputCharacter 实际上是一个宏,并且在 Code::Blocks 和 MS Visual Studio 之间定义不同,因为两个不同的,存在于两个版本中的函数:WriteConsoleOutputCharacterA() 和 WriteConsoleOutputCharacterW( ), 遗憾的是,MS 文档中没有提到它。
提前谢谢你,
莫里斯.
首先,WriteConsoleOutputCharacter()
需要一个宽字符串作为参数,而您传递的是普通字符串 "mystring"
作为参数。要使其成为宽文字,您只需添加字母 L
作为前缀 - 例如:L"mystring
”。程序会给出错误,因为您检索的句柄是 input句柄(STD_INPUT_HANDLE
)。同时,如果你想通过句柄输出到控制台,你需要检索一个output句柄(STD_OUTPUT_HANDLE
).
我正在尝试使用 WinAPI 来操作控制台,主要是能够随时随地编写我想要的任何内容,而无需重写整个控制台。我记得我曾经让它工作过,但那是很久以前的事了,我似乎忘记了那个代码……哎呀。
无论如何,我记得,我比现在付出的努力少得多。
我正在使用 this MS Docs page 作为参考,我记得以前使用过它,成功了。
现在,我真正要开始工作的只有几行:
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
HANDLE hndl = GetStdHandle(STD_INPUT_HANDLE);
if (hndl == INVALID_HANDLE_VALUE)
{
cout << "Invalid handle, error " << GetLastError();
return 0;
}
long unsigned int *chars_written = new long unsigned int;
if (!WriteConsoleOutputCharacter(hndl, "mystring", 8, {20, 30}, chars_written))
{
cout << "Could not write, error " << GetLastError();
return 0;
}
return 0;
}
结果是控制台 window 显示 "Could not write, error 6" 然后结束应用程序。
错误6,根据System Error Codes是"the handle is invalid"。
我做错了什么?我一定是漏掉了什么。
我尝试在 Code::Blocks 工作似乎很重要。
奖励:我在 MS Visual Studio 中尝试了完整的 WinAPI SDK(Code::Blocks 中似乎缺少一些重要部分),虽然主要问题是相同的,但 MS Visual Studio 似乎并不完全符合我使用的官方参考资料,例如WriteConsoleOutputCharacter requires an LPCWSTR as its 2nd argument instead of a LPCSTR as mentioned in the source and as works in Code::Blocks. Windows Data Types
编辑:我发现 WriteConsoleOutputCharacter 实际上是一个宏,并且在 Code::Blocks 和 MS Visual Studio 之间定义不同,因为两个不同的,存在于两个版本中的函数:WriteConsoleOutputCharacterA() 和 WriteConsoleOutputCharacterW( ), 遗憾的是,MS 文档中没有提到它。
提前谢谢你, 莫里斯.
首先,WriteConsoleOutputCharacter()
需要一个宽字符串作为参数,而您传递的是普通字符串 "mystring"
作为参数。要使其成为宽文字,您只需添加字母 L
作为前缀 - 例如:L"mystring
”。程序会给出错误,因为您检索的句柄是 input句柄(STD_INPUT_HANDLE
)。同时,如果你想通过句柄输出到控制台,你需要检索一个output句柄(STD_OUTPUT_HANDLE
).