首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VS2005中关于char[]转换成LPCWSTR的问题

VS2005中关于char[]转换成LPCWSTR的问题

作者头像
ccf19881030
发布2019-04-29 18:57:09
1.4K0
发布2019-04-29 18:57:09
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

      最近在使用VS2005,有时VC6.0中的工程拿到VC2005下经常会出现问题,比如最令我头痛的问题之一是:

错误 : error C2664: 'LoadImageW' : cannot convert parameter 2 from 'char [20]' to 'LPCWSTR'“char [20]”转换为“LPCWSTR”

      一、问题的原因:VS2005默认采用宽字符UNICODE编码方式,定义了Unicode,因此相关的字符串必须为unicode字符串,而非ascii字符串。

LPCWSTR中的W是宽字符的意思,是UNICODE,就是说不是传统的char这种单字节字符,而是一个字符占两字节. 编译器把LoadImage解释成了LoadImageW,说明代码中某个地方定义了UNICODE开关,编译环境成了宽字节的,要把这个定义去掉.

Win32 API也分2中版本, MessageBoxA / MessageBoxW,,,MessageBox根据是否定义_UNICODE宏而定义到其中一个版本。

     二、正确的解决方案是 选择【项目菜单】->【最后的属性】->【配置属性】->【常规】->【项目默认值】->unicode改为未设置。

     三、几个注意事项(此处引用了一个中国台湾开发论坛的几句话):

1,若定义UNICODE,相关的字串都必须使用Unicode的字串,而非ANSI字串。也就是:wchar_t * wfilename; (2)指定的Unicode字串常数,请加L“...”;例如:wchar_t *wfilename= L“HelloWorld”;

3.ansi字串(就是传统的char*)与wchar_t的*unicode的的字符串互转,请用MultiByteToWideChar与WideCharToMultiByte这两个API函数。 4,如果不太懂unicode的,那么就不要加UNICODE定义,用传统的方式来处理。

     四、那么如何将char*或者char数组转换成VS2005中的LPCWSTR呢?

(1)先看击中错误的方法:

       char buffer[80];  错误方法一:          wsprintf(buffer,L"WM_CHAR: Character = %c   ",ascii_code);          TextOut(hdc, 0,0,(LPCWSTR)buffer, strlen(buffer)); 这个只能显示第一个字母“W” 错误方法二:          sprintf((LPCWSTR)buffer,L"Key State = 0X%X  ",key_state);          TextOut(hdc, 0,16,(LPCWSTR)buffer, strlen(buffer)); 这个出现的是乱码! 错误方法三:                  sprintf(buffer,L"Key State = 0X%X  ",key_state);          TextOut(hdc, 0,16,buffer, strlen(buffer)); 这个提示不能将char[80]转换成LPCWSTR

强制类型转换是不行的,因为一个是字符占一个字节,一个事占两个字节,但是sprintf等函数是不知道的。

(2)正确转换方法:

方法一:使用MultiByteToWideChar和 MultiByteToWideChar函数,大家可以参考CSDN论坛的这篇帖子http://topic.csdn.net/u/20080229/14/eb027e95-8e4e-4afe-abf3-b85d90427355.html?seed=824864853&r=60494553#r_60494553

代码如下: #include <windows.h> #include <atlstr.h> #define STRSAFE_NO_DEPRECATE #include <strsafe.h>            // for String... functions #include <crtdbg.h>                // for _ASSERTE      CStringW ConvertW(CString str, int sourceCodepage)     {         //int len=str.GetLength();         int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0) + 1;         wchar_t* pUnicode;         pUnicode=new wchar_t[unicodeLen];         memset(pUnicode,0,(unicodeLen)*sizeof(wchar_t));         MultiByteToWideChar(sourceCodepage, CP_ACP, str, -1, (LPWSTR)pUnicode, unicodeLen);         CStringW rt = pUnicode;         //delete pUnicode;         SAFE_DELETEGROUP( pUnicode );         return rt;     } 调用:        CStringW wszTemp = ConvertW( Filename, CP_ACP);         LPWSTR pwStr = wszTemp.GetBuffer();  

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012年09月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档