尝试执行任何需要处理的错误时,无法修复WinAPI中的“无效句柄”错误

时间:2019-05-08 09:55:32

标签: c++ winapi codeblocks windows-console

我正在尝试使用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”,然后结束应用程序。

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

我在做什么错?我一定很想念东西。

我尝试使用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文档中未提及。

预先感谢您, 莫里斯。

1 个答案:

答案 0 :(得分:3)

首先,在传递普通字符串WriteConsoleOutputCharacter()作为参数时,"mystring"需要一个宽字符串作为参数。要使其具有广泛的文字范围,您只需添加字母L作为前缀-例如:L"mystring“。由于您要检索的句柄是,该程序给您一个错误输入句柄(STD_INPUT_HANDLE)。同时,如果要通过句柄输出到控制台,则需要检索输出句柄(STD_OUTPUT_HANDLE)。 / p>