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

C++基于Windows API开发命令行游戏引擎报“操作已成功”错误问题

问题成因
  • 你触发的是自定义业务逻辑错误,而非Windows API调用失败:CheckConsoleSize内的尺寸超限判断是自行实现的校验规则,触发该错误时没有任何Windows API调用失败,因此系统GetLastError()返回值仍为上一次成功调用API后的默认值0,对应系统提示就是「操作已成功」。
  • GetLastError()仅在Windows API明确返回失败状态(如返回INVALID_HANDLE_VALUE、返回FALSE等)时才有参考意义,正常执行的API不会重置该值,因此业务错误场景下读取到的系统错误信息是无效的。
解决方案

核心是区分「系统API调用错误」和「自定义业务逻辑错误」,不要在业务错误场景下读取系统错误码:

  1. 修改Error函数,增加是否输出系统错误的控制参数
void Error(const HANDLE& hConsole, const wchar_t* msg, bool isSysError = true) {
    SetConsoleActiveScreenBuffer(hConsole);
    wprintf(L"ERROR: %s\n", msg);
    // 仅系统错误场景读取系统错误信息
    if (isSysError) {
        wchar_t buf[256];
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL);
        wprintf(L"\t%s\n", buf);
    }
    exit(-1);
}
  1. 业务错误触发时关闭系统错误输出
    在CheckConsoleSize中调用Error时,指定不需要输出系统错误:
if (screenWidth > largestSize.X) 
    Error(hConsole, L"The width dimension is too large.", false);
if (screenHeight > largestSize.Y) 
    Error(hConsole, L"The height dimension is too large.", false);

原有API调用失败的场景(如CreateConsoleScreenBuffer返回无效句柄、SetConsoleScreenBufferSize调用失败等)无需修改参数,仍按原有逻辑输出系统错误信息即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:07