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
相关产品推荐
相关产品推荐

