繁体   English   中英

SetConsoleWindowInfo 不会引发错误,但会导致我的 C++ 代码崩溃

[英]SetConsoleWindowInfo not throwing error but crashing my C++ code

我正在使用 C++ 和命令提示符,但是当我尝试设置控制台 window 大小时,function 没有给出预期的结果。 但是当我调用GetLastError()时,它不会返回任何错误字符串。 我在 Windows 11 上并使用 Visual Studio 2022 和 Visual C++。 这是我的代码...

#include <Windows.h>
#define SCREENX 120
#define SCREENY 60

int main()
{
  CONSOLE_FONT_INFOEX cfi = { sizeof(cfi) };
  cfi.cbSize = sizeof(cfi);
  cfi.nFont = 0;
  cfi.dwFontSize.X = 4;
  cfi.dwFontSize.Y = 4;
  cfi.FontFamily = FF_DONTCARE;
  cfi.FontWeight = FW_NORMAL;

  SMALL_RECT coords = {
      SCREENY,
      0,
      SCREENX,
      0
  };

  wchar_t* screen = new wchar_t[SCREENX * SCREENY];
  HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | 
  GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
  DWORD dwBytesWritten = 0;


  wcscpy_s(cfi.FaceName, L"Consolas");
  if (!SetCurrentConsoleFontEx(hConsole, false, &cfi))
      return 801;

  if (!SetConsoleWindowInfo(hConsole, TRUE, &coords))
      MessageBox(NULL, TEXT("" + GetLastError()), TEXT("ERROR"), MB_OK);
      return 802;

  SetConsoleActiveScreenBuffer(hConsole);
}

编辑:虽然知道为什么GetLastError()不起作用会有所帮助,但我更想知道为什么SetConsoleWindowInfo()不起作用。

由于您提到问题出在GetLastError()上,因此问题在于您在调用MessageBox()时尝试调用GetLastError()时引入了未定义的行为。

这一行:

MessageBox(NULL, TEXT("" + GetLastError()), TEXT("ERROR"), MB_OK);

MessageBox()的这个参数有问题:

TEXT("" + GetLastError())

问题是+不会GetLastError()变成字符串。 它所做的是添加两个指针值,指向字符串文字""的指针和GetLastError())的值。 最后是一个指针,我不知道,你不知道,没人知道。 但无论它是MessageBox最终使用它,导致未定义的行为。

我假设您的意图是“字符串化” GetLastError()的值。 这不是 C++ 中的做法。

首先,最好知道您的应用程序实际上是 Unicode 还是多字节 (MBCS) 应用程序。 原因是TEXT宏将是宽字符串或窄字符串,具体取决于应用程序类型(检查您的项目设置)。

假设它是 Unicode,并且您没有使用 MBCS(使用 Visual Studio 的项目的默认设置)。 要将值转换为字符串:

#include <string>
//...
if (!SetConsoleWindowInfo(hConsole, TRUE, &coords))
{
    std::wstring errMsg = std::to_string(GetLastError());
    MessageBox(NULL, errMsg.c_str(), L"ERROR", MB_OK);
    return 802;
}

如果由于某种原因它是一个 MBCS 项目:

#include <string>
//...
if (!SetConsoleWindowInfo(hConsole, TRUE, &coords))
{
    std::string errMsg = std::to_string(GetLastError());
    MessageBox(NULL, errMsg.c_str(), "ERROR", MB_OK);
    return 802;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM