当前位置: 首页 > news >正文

报错E0513:不能将 “const wchar_t *“ 类型的值分配到 “LPWSTR“ (aka “wchar_t *“) 类型的实体

书籍:《Visual C++ 2017从入门到精通》的2.3.8 Win32控件编程

环境:visual studio 2022

内容:【例2.26】双击某行返回行内容的列表视图控件

说明:以下内容大部分来自腾讯元宝。

问题

以下代码报错:ColInfo1.pszText = _T("姓名");报错:不能将 "const wchar_t *" 类型的值分配到 "LPWSTR" (aka "wchar_t *") 类型的实体。

ColInfo1.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
ColInfo1.iSubItem = 0;
ColInfo1.fmt = LVCFMT_CENTER;
ColInfo1.cx = 100;
ColInfo1.pszText = _T("姓名");
ColInfo1.cchTextMax = 60;
::SendMessage(hListView, LVM_INSERTCOLUMN, WPARAM(0), LPARAM(&ColInfo1));

解决方法

在Visual Studio 2022中遇到“不能将 const wchar_t* 类型的值分配到 LPWSTR 类型”的错误,通常是由于字符串字面量的const属性与目标非const指针类型不匹配导致。以下是分场景解决方案:


一、直接移除const属性(推荐)​

通过 const_cast 显式移除字符串字面量的const属性:

ColInfo1.pszText = const_cast<LPWSTR>(_T("姓名"));  // [3](@ref)

详细内容可参考:

const_cast-CSDN博客https://blog.csdn.net/qq_20725221/article/details/146185373?sharetype=blogdetail&sharerId=146185373&sharerefer=PC&sharesource=qq_20725221&spm=1011.2480.3001.8118

适用场景

  • 字符串内容不需要修改(如静态标签)。
  • 确保目标控件不尝试修改该字符串(如只读列表列名)。

二、创建可修改的缓冲区

若需动态修改字符串内容,建议分配新的非const内存:

wchar_t wszText[] = L"姓名";
ColInfo1.pszText = wszText;  // [3](@ref)

优势

  • 避免直接修改字符串字面量(某些安全场景要求)。
  • 支持后续对字符串的修改操作。

三、使用转换函数(备选方案)​

若需处理多字节/宽字节混合编码,可通过以下函数转换:

// 方法1:MultiByteToWideChar(适用于char*转LPWSTR)
char* szText = "姓名";
int len = MultiByteToWideChar(CP_ACP, 0, szText, -1, NULL, 0);
wchar_t* wszText = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, szText, -1, wszText, len);
ColInfo1.pszText = wszText;  // [1,2](@ref)
// 记得释放内存:delete[] wszText;

// 方法2:wcstombs_s(适用于已有wchar_t*)
const wchar_t* wszConstText = L"姓名";
size_t len = wcslen(wszConstText) + 1;
wchar_t* wszText = new wchar_t[len];
wcstombs_s(&len, wszText, len, wszConstText, _TRUNCATE);
ColInfo1.pszText = wszText;  // [1](@ref)

四、编译模式检查

确保项目设置为Unicode字符集​(否则_T宏会生成char*类型):

  1. 右键项目 → ​属性 → ​配置属性 → ​常规 → ​字符集 → 选择 ​使用Unicode字符集
  2. 若需兼容多字节字符集,可结合_UNICODE宏定义使用。

总结

场景推荐方案引用来源
静态字符串且无需修改const_cast<LPWSTR>(_T("..."))

3

需动态修改字符串内容分配wchar_t[]缓冲区

3

多字节/宽字节混合编码使用MultiByteToWideCharwcstombs_s转换函数

1

2

若问题仍未解决,建议检查控件属性是否支持LPWSTR类型(如某些旧版控件可能需要LPCWSTR)。

相关文章:

  • 【性能测试入门_01性能测试jmeter基础实操场景详解】
  • # 如何确认elementary os (linux)使用的是Wayland而不是x11?
  • TCP连接过程图解
  • Android Compose是如何使用什么架构,多个Activity?还是Fragment?compose的ui又是如何卸载和挂载的呢?
  • 【day10】智慧导览:学习LBS定位精度标准
  • markdown转docx
  • Java基础关键_020_集合(四)
  • 电网电压暂态扰动机理与工业设备抗失压防护策略研究
  • 【SpringBoot】深入剖析 Spring Boot 自动装配原理(附源码与实战)
  • 内存检测工具——Qt Creator
  • git使用命令总结
  • python总结(3)
  • QT工程打开、编译、运行流程
  • Netty基础—2.网络编程基础三
  • Dify平台训练个人文档助手
  • 2024年群智能SCI1区TOP:混沌可行性恢复粒子群算法CEPSO,深度解析+性能实测
  • 20250212:linux系统DNS解析卡顿5秒的bug
  • 关于mybatis查询时,时间字段的映射问题
  • Java 集合框架大师课:集合框架源码解剖室(五)
  • 内网安全防护新思路 —— HFish + ELK 与 T-Pot 全面蜜罐系统比较分析
  • 人民日报评外卖平台被约谈:合法规范经营,公平有序竞争
  • 多家外资看好中国市场!野村建议“战术超配”,花旗上调恒指目标价
  • 上海北外滩开发建设五周年交出亮眼答卷,未来五年有何新目标?
  • 周启鸣加盟同济大学,曾任香港浸会大学深圳研究院院长
  • 山东鄄城发生一起交通事故,造成4人死亡、2人受伤
  • 外交部:中方期待印巴巩固和延续停火势头,避免冲突再起