尝试执行任何需要它时无法修复 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).