看流星社区

 找回密码
 注册账号
查看: 1821|回复: 0

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

[复制链接]

该用户从未签到

发表于 2015-3-31 16:07:08 | 显示全部楼层 |阅读模式
一、问题的原因:VS2010默认采用宽字符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函数

代码如下:
#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();
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-25 15:40

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表