[英]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.