不能从const char指针转换为LPCWSTR的原因及解决方法

使用VS2008开发上位机软件,

在存储模块,利用GetSaveFileName(&ofn) 函数创建文件选择窗口选择要存储的文件,在初始化OPENFILENAME结构体对象ofn时报错,具体是利用常字符串对ofn成员变量lpstrFile和lpstrFilter初始化报错:不能从const char *转换为LPCWSTR或LPCSTR。

原代码如下:

 

     OPENFILENAME ofn;       // commondialog box structure

     char szFile[260];       // buffer forfile name

     HWND hwnd=this->m_hWnd;              //owner window

     // Initialize OPENFILENAME

     ZeroMemory(&ofn,sizeof(ofn));

     ofn.lStructSize= sizeof(ofn);

     ofn.hwndOwner =hwnd;

     ofn.lpstrFile =szFile;

     //

     // Set lpstrFile[0] to '\0' so that GetOpenFileName doesnot

     // use the contents of szFile to initialize itself.

     //

     ofn.lpstrFile[0]= '\0';

     ofn.nMaxFile = sizeof(szFile);

     ofn.lpstrFilter= "All\0*.*\0Text\0*.TXT\0";

     ofn.nFilterIndex= 1;

     ofn.lpstrFileTitle= NULL;

     ofn.nMaxFileTitle= 0;

     ofn.lpstrInitialDir= NULL;

     ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

报错截图如下:

错误原因:

因为我的程序在UNICODE(宽字节)字符集下运行, UNICODE与ANSI有什么区别呢?简单的说,UNICODE版的字符比ANSI 的内存占用大,比如:Win32程式中出现的标准定义 char 占一个字节,而 char 的UNICODE版被定义成这样: typedef unsigned short wchar_t ;占2个字节。 所以有字符做参数的函数相应也用两个版本了

可行方法:

可行的办法是使用 _T("TEST")转换,或者TEXT("TEST" )都可以 ,另外,在初始化过程LPCWSTR时,不是char*,而是_wchar_t。

修改后代码:

          OPENFILENAMEofn;      // common dialog box structure

     wchar_t szFile[260];       // buffer forfile name

     HWND hwnd=this->m_hWnd;              //owner window

     // Initialize OPENFILENAME

     ZeroMemory(&ofn,sizeof(ofn));

     ofn.lStructSize= sizeof(ofn);

     ofn.hwndOwner =hwnd;

     ofn.lpstrFile =szFile;

     //

     // Set lpstrFile[0] to '\0' so that GetOpenFileName doesnot

     // use the contents of szFile to initialize itself.

     //

     ofn.lpstrFile[0]= '\0';

     ofn.nMaxFile = sizeof(szFile);

     ofn.lpstrFilter= _T("All\0*.*\0Text\0*.TXT\0");

     ofn.nFilterIndex= 1;

     ofn.lpstrFileTitle= NULL;

     ofn.nMaxFileTitle= 0;

     ofn.lpstrInitialDir= NULL;

     ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

网上类似问题解答:

 

不能从constchar *转换为LPCWSTR

在VC6.0中编译成功的项目在VS2005vs2005、vs2008、vs2010中常会出现类型错误。

经常出现的错误是:不能从const char *转换为LPCWSTR

如使用MessageBox(hwnd,"TEST",NULL,0)就会报错,如果使用强制转换(LPCWSTR)"TEST",虽然能够通过,但是编码会出错。

可行的办法是使用 _T("TEST")转换,或者TEXT("TEST" )都可以

MessageBox(hwnd,TEXT("TEST"),NULL,0);

MessageBox(hwnd,_T("TEST"),NULL,0);

或者 强制使用ANSI字符MessageBoxA(hwnd,"TEST",NULL,0);

另一种方法是:项目菜单——项目属性(最后一个)——配置属性——常规——项目默认值——字符集,将使用Unicode字符集改为未设置即可。

什么原因:

因为你的程序在UNICODE(宽字节)字符集下运行,如果调用了 MessageBox ,实际上调用的是 MessageBoxW 函数;

如果你的程序在 ANSI 字符集运行,调用 MessageBox ,就相当于调用 MessageBoxA;

其中MessageBoxW 支持UNICODE;MessageBoxA支持ANSI;

UNICODE与ANSI 有什么区别呢?简单的说,UNICODE版的字符比ANSI 的内存占用大,比如:Win32程式中出现的标准定义 char 占一个字节,

而char 的UNICODE版被定义成这样:

typedefunsigned short wchar_t ;占2个字节。

所以有字符做参数的函数相应也用两个版本了。

你可能感兴趣的:(C++编程)