报错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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值