C++无ATL环境下LPCSTR转LPCWSTR及相关异常问题求助
解决方案
无ATL实现LPCSTR到LPCWSTR转换
直接调用Windows原生API MultiByteToWideChar 即可实现转换,不需要依赖ATL库,以下是两种常用封装:
手动内存管理版本
#include <windows.h> // 返回的LPWSTR用完后必须调用LocalFree释放,避免内存泄漏 LPWSTR ConvertLPCSTRToLPCWSTR(LPCSTR szAnsiStr) { if (szAnsiStr == nullptr) return nullptr; // 计算所需宽字符缓冲区长度 int reqBufLen = MultiByteToWideChar(CP_ACP, 0, szAnsiStr, -1, nullptr, 0); if (reqBufLen == 0) return nullptr; // 申请内存 LPWSTR szWideStr = (LPWSTR)LocalAlloc(LPTR, reqBufLen * sizeof(WCHAR)); if (szWideStr == nullptr) return nullptr; // 执行转换 MultiByteToWideChar(CP_ACP, 0, szAnsiStr, -1, szWideStr, reqBufLen); return szWideStr; }
调用示例:
LPCSTR gameTitle = "控制台游戏引擎"; LPWSTR wideTitle = ConvertLPCSTRToLPCWSTR(gameTitle); if (wideTitle) { SetConsoleTitleW(wideTitle); LocalFree(wideTitle); }
自动内存管理版本(基于std::wstring)
#include <windows.h> #include <string> std::wstring AnsiToWide(LPCSTR szAnsiStr) { if (szAnsiStr == nullptr) return L""; int reqBufLen = MultiByteToWideChar(CP_ACP, 0, szAnsiStr, -1, nullptr, 0); if (reqBufLen == 0) return L""; std::wstring wideStr(reqBufLen, L'\0'); MultiByteToWideChar(CP_ACP, 0, szAnsiStr, -1, &wideStr[0], reqBufLen); wideStr.pop_back(); // 移除多余的末尾空终止符 return wideStr; }
调用示例:
SetConsoleTitleW(AnsiToWide("控制台游戏引擎").c_str());
标题叠加到控制台绘制区域问题修复
该问题与LPCWSTR类型本身无关,可按以下顺序排查修复:
- 统一所有控制台API为UNICODE版本:所有接口都使用W后缀版本(如
SetConsoleTitleW、WriteConsoleOutputW等),避免ANSI和UNICODE接口混用导致的字符编码不匹配、缓冲区内容异常。 - 确认传入
SetConsoleTitleW的字符串有正确的空终止符:建议直接使用上述std::wstring版本的转换函数,自动处理字符串边界,避免内存越界。 - 检查矩形绘制逻辑:确认绘制函数计算的写入坐标没有越界,不会误将内容写入到非预期的缓冲区位置。
内容的提问来源于stack exchange,提问作者BaagadBilla
相关产品推荐
相关产品推荐

