使用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个字节。
所以有字符做参数的函数相应也用两个版本了。