一、问题的原因: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函数,大家可以参考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();

转自:http://my.oschina.net/u/187483/blog/110723

关于char[]转换成LPCWSTR的有关问题[转]的更多相关文章

  1. char[]转换成wchar_t的转换方法(GNU Libc规定wchar_t为32位)

    wchar_t是C/C++的字符数据类型,是一种扩展的字符存储方式,wchar_t类型主要用在国际化程序的实现中,但它不等同于unicode编码.unicode编码的字符一般以wchar_t类型存储. ...

  2. char*或string转换成LPCWSTR

    VS2010默认是Unicode的,在VC 6.0中编译成功的项目在VS2010中常会出现类型错误. 经常出现的错误是:不能从const char *转换为LPCWSTR 如使用CreateDC(&q ...

  3. NX二次开发-char*转换成CString,多字节转换成Unicode使用方法

    //定义一个结构体记录 struct group { CString text; //定义一个CString std::vector<tag_t> boudaries; std::vect ...

  4. QString转换成LPCWSTR

    不知道大家用QT做什么程序,但应该还是Windows程序居多吧,仍免不了与WINAPI打交道.这就要求数据类型要与Windows一致,而QT的数据类型却是自成一体的.这就需要转换.比如我用到了Logo ...

  5. 将 unsiged char 转换成对应的十六进制字符用以显示出来如 unsiged char a[]={0x00,0x01,0x30,0x38}转化为“00013038”

    int CEnCryptionAndDeCryptionDlg::Byte2Hex(const unsigned char* input,unsigned long inLen, unsigned c ...

  6. c++ char转换成string

    第一种:利用赋值号直接赋值 ; string b = a; /* 错误.因为string是一个指针,存储的值是所指向的地址,而char型存储的是内容,所以不可以直接用赋值号赋值 */ const ch ...

  7. char* 转换成 CString

    真是有意思: CString mess ;    mess = m_chLocalIP; 这样OK,但是写在一行就会报错 CString mess  = m_chLocalIP; //有问题

  8. CString 转换成 char *

    最近用到CString类,转换成 char * 类型,下面介绍用法: 一.CString 和 LPSTR 转换: CString转换成LPSTR: 方法一:CString server; LPSTR ...

  9. VC2008中将CString转换成const char*的一种有效方法

    文章转载自http://blog.csdn.net/lanbing510/article/details/7425613 在Visual Studio 200X下,CString直接转换成const ...

随机推荐

  1. Python 推断素数

    a = raw_input() #输入数字 a = int(a) #铸造成int b=True #的标记 for i in range(2,a): #从2开始循环本身 if a%i==0: #除了自己 ...

  2. SICP 1.17-1.19

    1.16 -------------> 不考虑0的情况 <------------ (define (fe b n) (define (fet m c) (cond ((= m n) c) ...

  3. 根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案

    原文:根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案 问题: C#中,想动态产生这么一个类: public class StatisticsData    {        public ...

  4. LeetCode - 4 - Longest Substring Without Repeating Characters

    题目 URL:https://leetcode.com/problems/median-of-two-sorted-arrays/ 解法 二分法. 总的思想是将 2 个数组用 2 个指针“整体”二分. ...

  5. C# Textbox的ImeMode取值对中文输入法的影响(进入才能看清)

    原文:C# Textbox的ImeMode取值对中文输入法的影响(进入才能看清) C# Textbox的ImeMode取值对中文输入法的影响             取值 五笔加加 微软拼音3.0 搜 ...

  6. WPF中ItemsControl应用虚拟化时找到子元素的方法

    原文:WPF中ItemsControl应用虚拟化时找到子元素的方法  wpf的虚拟化技术会使UI的控件只初始化看的到的子元素, 而不是所有子元素都被初始化,这样会提高UI性能. 但是我们经常会遇到一个 ...

  7. win32界面程序开发,自制一个会自动销毁的提示框

    思路:创建线程里面启动窗口,设置定时器关闭该窗口. 创建窗口几个步骤和一般窗口无异,注册.然后createwindow,之后showwinodw,然后消息循环. 在createwindow之后,获取到 ...

  8. ORACLE RAC+OGG配置

    实验环境主机名   IP地址rac01     192.168.56.10rac02     192.168.56.20rac-scan 192.168.56.30 目标库:ora-ogg  192. ...

  9. Android零基础入门第63节:过时但仍值得学习的选项卡TabHost

    原文:Android零基础入门第63节:过时但仍值得学习的选项卡TabHost 由于前几天参加一个学习培训活动,几乎每天都要从早晨7点到晚上一两点,没有什么时间来分享,实在抱歉中间断更了几天.从今天开 ...

  10. 如何把zip文件直接解压到内存里?

    解压到硬盘再读进来耽误时间. var  LZip: TZipFile;  LMem: TMemoryStream;  LBytes: TBytes;begin  LZip := TZipFile.Cr ...