不能从const char指针转换为LPCWSTR的原因及解决方法
来源:互联网 发布:淘宝虚拟商品怎么上架 编辑:程序博客网 时间:2024/05/21 03:26
使用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个字节。
所以有字符做参数的函数相应也用两个版本了。
- 不能从const char指针转换为LPCWSTR的原因及解决方法
- 不能从const char *转换为LPCWSTR
- 提示不能从“const char *”转换为“LPCWSTR” 的解决办法
- VS遇到的 -- 不能从const char *转换为LPCWSTR
- VS2010 error C2664: “GetModuleHandleW”: 不能将参数 1 从“const char [10]”转换为“LPCWSTR” 解决方法
- VS2005 错误 不能从const char *转换为LPCWSTR
- 不能从const char *转换为LPCWSTR 经常碰到
- 不能从const char *转换为LPCWSTR 经常碰到
- 不能从const char *转换为LPCWSTR 经常碰到
- 不能从const char *转换为LPCWSTR 经常碰到
- 不能从const char *转换为LPCWSTR 经常碰到
- 不能将参数 1 从const char [*]转换为LPCWSTR
- 关于 不能从const char *转换为LPCWSTR
- 解决不能从CONST CHAR *转换为LPCWSTR
- Visual Studio 2013 不能从const char *转换为LPCWSTR
- VS2010不能将参数从const char[]转换为LPCWSTR的解决办法
- VC“中 不能将参数 从“const char *”转换为“LPCWSTR” 的解决办法
- VS不能将参数从const char[]转换为LPCWSTR的解决办法
- 连载:面向对象葵花宝典:思想、技巧与实践(5) - 面向对象迷思:面向对象导致性能下降?
- Error: Unable to access jarfile ..\lib\proguard.jar
- Unique PatUnique Paths II
- JS-原型对象的理解
- ACM练习建议
- 不能从const char指针转换为LPCWSTR的原因及解决方法
- 哥德巴赫猜想
- 硕士论文专业定做网站
- dom4j
- AppleScript
- 解决 Errors running builder 'DeploymentBuilder' on project '
- 阿里实习生电面题 我的解法
- JUnit中assertEquals和assertSame方法的不同
- ios数据持久化