gpt4 book ai didi

c++ - 尝试执行任何需要它时无法修复 WinAPI 中的 "invalid handle"错误

转载 作者:行者123 更新时间:2023-11-30 02:15:33 26 4
gpt4 key购买 nike

我正在尝试使用 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;
}

结果是控制台窗口显示“无法写入,错误 6”,然后结束应用程序。

错误 6,根据 System Error Codes是“句柄无效”。

我做错了什么?我一定是遗漏了什么。

我尝试在 Code::Blocks 中工作似乎很重要。

奖励:我尝试使用带有完整 WinAPI SDK 的 MS Visual Studio(Code::Blocks 中似乎缺少一些重要部分),虽然主要问题是相同的,但 MS Visual Studio 中的函数似乎没有都符合我正在使用的官方引用资料,例如WriteConsoleOutputCharacter需要一个 LPCWSTR 作为它的第二个参数,而不是源代码中提到的 LPCSTR 和 Code::Blocks 中的作品。 Windows Data Types

编辑:我发现 WriteConsoleOutputCharacter 实际上是一个宏,并且在 Code::Blocks 和 MS Visual Studio 之间的定义不同,因为两个不同的函数存在于两个版本中:WriteConsoleOutputCharacterA() 和 WriteConsoleOutputCharacterW(),遗憾的是, MS 文档中未提及。

先谢谢你,莫里斯。

最佳答案

首先,WriteConsoleOutputCharacter() 需要一个宽字符串作为参数,而您传递的是普通字符串 "mystring" 作为参数。要使其成为宽文字,您只需添加字母 L 作为前缀 - 例如:L"mystring"。并且程序给您一个错误,因为您检索的句柄是一个输入 句柄 (STD_INPUT_HANDLE)。同时,如果你想通过句柄输出到控制台,你需要检索一个输出句柄(STD_OUTPUT_HANDLE)。

关于c++ - 尝试执行任何需要它时无法修复 WinAPI 中的 "invalid handle"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56038009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com