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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:36:04