You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WriteConsoleOutputCharacterW规范问题:NumberOfCharsWritten为0及LPDWORD报错

解决WriteConsoleOutputCharacterW的NumberOfCharsWritten错误

错误原因

你把NumberOfCharsWritten声明成了空指针(LPDWORD是DWORD*的别名),而WriteConsoleOutputCharacterW的最后一个参数要求是指向有效DWORD变量的指针——函数会通过这个指针返回实际写入控制台的字符数,传空指针完全违反函数调用规范,所以触发错误。

修正方案

  • 声明普通的DWORD变量,而非空指针
  • 调用函数时传入该变量的地址(用&取地址)
  • 额外优化:初始化screen数组避免垃圾值输出,循环中加入Sleep降低CPU占用,程序结束释放动态内存

修正后的代码:

#include<iostream>
#include<Windows.h>

using namespace std;

int main()
{
    COORD cell{0, 0};
    DWORD NumberOfCharsWritten; // 声明普通DWORD变量
    wchar_t* screen = new wchar_t[80 * 30];
    // 初始化数组为空格,避免乱码
    for (int i = 0; i < 80 * 30; ++i) {
        screen[i] = L' ';
    }
    // 补充GENERIC_WRITE权限,确保能写入缓冲区
    HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    if (hConsole == INVALID_HANDLE_VALUE) {
        cout << "控制台缓冲区创建失败" << endl;
        return 1;
    }
    SetConsoleActiveScreenBuffer(hConsole);

    while (true)
    {
        screen[10 * 80 + 15] = L'P';
        // 传入变量地址而非空指针
        WriteConsoleOutputCharacter(hConsole, screen, 80 * 30, cell, &NumberOfCharsWritten);
        Sleep(16); // 控制帧率,降低CPU占用
    }

    delete[] screen; // 释放动态分配的内存
    return 0;
}

补充说明

  • GENERIC_READ | GENERIC_WRITE:创建缓冲区时必须包含写权限,否则后续写入操作会失败
  • 初始化screen数组:动态分配的内存默认未初始化,直接写入控制台会显示乱码,提前填充空格可避免此问题
  • Sleep(16):让循环每帧暂停约16ms,对应60帧左右的刷新率,防止CPU被无意义的循环占满

内容的提问来源于stack exchange,提问作者Mefhisto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:09:20