专注app软件定制开发VC++ 2019 “const char*“类型的实参与“LPCTSTR“类型的形参不兼容,的解决办法

一、问题描述

项目使用Unicode编码,当使用tinyxml2读取xml内容时,利用root->Name()获取的是const char*专注app软件定制开发类型的字符串,专注app软件定制开发直接传递给Edit->SetWindowTextW(),专注app软件定制开发报以下错误

严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E0167 “const char *” 类型的实参与 “LPCTSTR” 类型的形参不兼容 MFCTinyxml2 C:\WebSite\MFCTinyxml2\MFCTinyxml2Dlg.cpp 106


导致无法正常编译

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2664 “void CWnd::SetWindowTextW(LPCTSTR)”: 无法将参数 1 从“const char *”转换为“LPCTSTR” MFCTinyxml2 C:\WebSite\MFCTinyxml2\MFCTinyxml2Dlg.cpp 106

二、解决办法

1、使用微软提供的ANSI转宽字符的函数MultiByteToWideChar,将char* 转换成 wchar_t*(宽字符)
2、再赋值给接受LPCTSTR宽字符类型的参数,就不再报错

附加示例代码:

const char* name = elmtRoot->Name();//先获取转换成宽字符后的长度(一定要通过这种方式,先回去字符长度,因为有指定编码为CP_ACP,编码不同,长度也会不同)int nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, NULL, 0);//声明一个宽字符类型变量,用于存放转换后的字符wchar_t* wname = new wchar_t[nLen];//利用微软ANSI转宽字符的函数(name:ANSI字符,wname:宽字符)MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, wname, nLen);pEditXml->SetWindowText(wname);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

多啰嗦几句:

1、网上有一些文章直接建议将VC++环境的字符集换成“多字节字符集”,强烈不建议这样做,因为Unicode是等同于UTF-8的编码格式,而多字节等同于GB2312(非国际化编码)

2、使用同一个函数/方法,网上示例却可以直接传char类型的参数,而我却一定要转成宽字符wchar_t的才行呢?
因为同样一个参数,VS为了国际化,目前默认字符集为“使用Unicode字符集”,以前大部分教程都是老版本VS或其他C++开发工具,因此无需转换,直接就可以接受char*类型的参数。
按住Ctrl键,打开VS中的方法定义,可以看出使用UNICODE字符集时,会自动对应SetWindowTextW(LPCWSTR str),否则对应SetWindowTextA(LPCSTR str)


3、要求传参是LPCWSTR的,为何报错是无法转换成LPCTSTR呢?
注:此问题我至今未解惑,只了解到以下逻辑关系,大致可理解,但还有不通的地方

  • LPCTSTR == const TCHAR* == CString,可根据代码环境UNICODE/ANSI做适配的变量类型
  • LPCWSTR = const wchar_t*,只存放UNICODE
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发