游戏中字符串由于版本不同而导致的错误问题.docx
- 文档编号:18383854
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:14
- 大小:72.43KB
游戏中字符串由于版本不同而导致的错误问题.docx
《游戏中字符串由于版本不同而导致的错误问题.docx》由会员分享,可在线阅读,更多相关《游戏中字符串由于版本不同而导致的错误问题.docx(14页珍藏版)》请在冰点文库上搜索。
游戏中字符串由于版本不同而导致的错误问题
一
vs2005、vs2008、vs2010默认是Unicode的,在VC6.0中编译成功的项目在VS2005中常会出现类型错误。
经常出现的错误是:
不能从constchar*转换为LPCWSTR
如使用MessageBox(hwnd,"rightmouseclicked",NULL,0)就会报错,如果使用强制转换(LPCWSTR)"rightmouseclicked",虽然能够通过,但是编码会出错。
可行的办法是使用TEXT("rightmouseclicked")转换,
MessageBox(hwnd,TEXT("rightmouseclicked"),NULL,0);
另一种方法是:
项目菜单——项目属性(最后一个)——配置属性——常规——项目默认值——字符集,将使用Unicode字符集改为未设置即可。
问题起因:
在写WritePrivateProfileString写.ini配置文件时在msdn中看到,如果想要写得配置信息即时生效必须在之前使用WritePrivateProfileStringW来re-read一下目标.ini文件,其原文如下:
// force the system to re-read the mapping into shared memory
// so that future invocations of the application will see it
// without the user having to reboot the system
WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" );
查了一下msdn中WritePrivateProfileStringW的原型如下:
WINBASEAPI BOOL WINAPI WritePrivateProfileStringW (
LPCWSTR lpAppName,
LPCWSTR lpKeyName,
LPCWSTR lpString,
LPCWSTR lpFileName )
其中的每个参数的类型都为LPCWSTR,实际中获得的文件名都为CString,问题产生。
问题分析:
LPCWSTR是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。
而CString是一个串类,内存空间类会自动管理。
LPCWSTR 初始化如下:
LPCWSTR Name=L"TestlpCwstr";
由于LPCWSTR必须指向Unicode的字符串,问题的关键变成了Anis字符与Unicode字符之间的转换,不同编码间的转换,通过查找资料可知,可以ATL中转换宏可以用如下方法实现:
//方法一
CString str=_T("TestStr");
USES_CONVERSION;
LPWSTR pwStr=new wchar_t[str.GetLength()+1];
wcscpy(pwStr,T2W((LPCTSTR)str));
// 方法二
CString str=_T("TestStr");
USES_CONVERSION;
LPWCSTR pwcStr = A2CW((LPCSTR)str);
MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR) ->(LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。
顺便也提一下,如果将LPCWSTR转换成CString,那就更加容易,在msdn中的CString类说明中提到了可以直接用LPCWSTR来构造CString,所以可以进行如下的转换代码:
LPCWSTR pcwStr = L"TestpwcStr";
CString str(pcwStr);
问题总结:
在头文件
A2CW (LPCSTR) -> (LPCWSTR)
A2W (LPCSTR) -> (LPWSTR)
W2CA (LPCWSTR) -> (LPCSTR)
W2A (LPCWSTR) -> (LPSTR)
所有的宏如下表所示:
A2BSTR
OLE2A
T2A
W2A
A2COLE
OLE2BSTR
T2BSTR
W2BSTR
A2CT
OLE2CA
T2CA
W2CA
A2CW
OLE2CT
T2COLE
W2COLE
A2OLE
OLE2CW
T2CW
W2CT
A2T
OLE2T
T2OLE
W2OLE
A2W
OLE2W
T2W
W2T
上表中的宏函数,非常的有规律,每个字母都有确切的含义如下:
2
to的发音和2一样,所以借用来表示“转换为、转换到”的含义。
A
ANSI字符串,也就是MBCS。
W、OLE
宽字符串,也就是UNICODE。
T
中间类型T。
如果定义了_UNICODE,则T表示W;如果定义了_MBCS,则T表示A
C
const的缩写
利用这些宏,可以快速的进行各种字符间的转换。
使用前必须包含头文件,并且申明USER_CONVERSION;使用ATL转换宏,由于不用释放临时空间,所以使用起来非常方便。
但是考虑到栈空间的尺寸(VC默认2M),使用时要注意几点:
1、只适合于进行短字符串的转换;
2、不要试图在一个次数比较多的循环体内进行转换;
3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
4、对情况2和3,要使用MultiByteToWideChar()和WideCharToMultiByte();
二
源程序如下:
#include
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intnShowCmd)
{
HANDLEhFile;
LPTSTRIpBuffer="HelloWorld!
";
hFile=CreateFile("C:
\\File.txt",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
CloseHandle(hFile);
TCHARszBuf(128);
DWORDdwRead;
DWORDdwWritten;
hFile=CreateFile("C:
\\File.txt",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,IpBuffer,strlen(IpBuffer)+1,&dwRead,NULL);
SetFilePointer(hFile,0,NULL,FILE_BEGIN);
if(ReadFile(hFile,szBuf,strlen(IpBuffer)+1,&dwWritten,NULL))
{
MessageBox(NULL,szBuf,"EXAM",MB_OK);
}
CloseHandle(hFile);
}
正在编译...
p35.cpp
c:
\documentsandsettings\true\mydocuments\visualstudio2005\projects\p35\p35\p35.cpp(6):
errorC2440:
“初始化”:
无法从“constchar[13]”转换为“LPTSTR”
与指向的类型无关;转换要求reinterpret_cast、C样式转换或函数样式转换
c:
\documentsandsettings\true\mydocuments\visualstudio2005\projects\p35\p35\p35.cpp(7):
errorC2664:
“CreateFileW”:
不能将参数1从“constchar[12]”转换为“LPCWSTR”
与指向的类型无关;转换要求reinterpret_cast、C样式转换或函数样式转换
c:
\documentsandsettings\true\mydocuments\visualstudio2005\projects\p35\p35\p35.cpp(12):
errorC2664:
“CreateFileW”:
不能将参数1从“constchar[12]”转换为“LPCWSTR”
与指向的类型无关;转换要求reinterpret_cast、C样式转换或函数样式转换
c:
\documentsandsettings\true\mydocuments\visualstudio2005\projects\p35\p35\p35.cpp(13):
errorC2664:
“strlen”:
不能将参数1从“LPTSTR”转换为“constchar*”
与指向的类型无关;转换要求reinterpret_cast、C样式转换或函数样式转换
c:
\documentsandsettings\true\mydocuments\visualstudio2005\projects\p35\p35\p35.cpp(15):
errorC2664:
“strlen”:
不能将参数1从“LPTSTR”转换为“constchar*”
与指向的类型无关;转换要求reinterpret_cast、C样式转换或函数样式转换
c:
\documentsandsettings\true\mydocuments\visualstudio2005\projects\p35\p35\p35.cpp(15):
errorC2664:
“ReadFile”:
不能将参数2从“TCHAR”转换为“LPVOID”
从整型转换为指针类型要求reinterpret_cast、C样式转换或函数样式转换
c:
\documentsandsettings\true\mydocuments\visualstudio2005\projects\p35\p35\p35.cpp(17):
errorC2664:
“MessageBoxW”:
不能将参数2从“TCHAR”转换为“LPCWSTR”
从整型转换为指针类型要求reinterpret_cast、C样式转换或函数样式转换
生成日志保存在“file:
//c:
\DocumentsandSettings\True\MyDocuments\VisualStudio2005\Projects\p35\p35\Debug\BuildLog.htm”
p35-7个错误,0个警告
为什么会这样呢?
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
回复次数:
16
∙
∙an_bachelor
∙(殘民之禍,惡國家甚於無國家)
∙等 级:
∙
#1楼得分:
5回复于:
2008-05-0210:
23:
48
可能因爲默認用Unicode所以LPTSTR\LPCWSTR都被定義成Unicode類型的字符串,char!
=wchar
TCHAR到LPVOID不同的類型要強制類型轉換TCHARszBuf(128);的意思並不是TCHARszBuf[128];
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
精华推荐:
狄仁杰--宦海浮沉,心系民生
∙
∙HwEAVEN
∙(HEAVEN)
∙等 级:
∙
#2楼得分:
1回复于:
2008-05-0210:
39:
59
就是楼上说的原因,用_T("C:
\\File.txt"),_T("HelloWorld!
")试试
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
精华推荐:
开源共享,自己写的界面及图象库,欢迎捧场。
∙
∙foxinhongyan
∙
∙等 级:
∙
#3楼得分:
0回复于:
2008-05-0210:
54:
06
学习了~_T貌似很有用啊呵呵
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
精华推荐:
[冒死发帖]dll源代码调试全攻略~包括ISAPI,APIHOOK,GINA等dll的源代码调试方法~
∙
∙aniuman
∙(一草一木)
∙等 级:
∙
#4楼得分:
1回复于:
2008-05-0210:
59:
52
在VC2005中,所有的字符都为Unicode,所以每一个字符串都因该加上_T("xxx")。
测定宽字符长度的函数是wcslen,而不是strlen。
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
精华推荐:
多线程同步的两个问题,可能需要高手,请关注!
∙
∙lw1a2
∙(一刀)
∙等 级:
∙
#5楼得分:
0回复于:
2008-05-0211:
06:
29
工程属性里可以改字符集
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
精华推荐:
关于wince系统的内存碎片,收集贴
∙
∙liumang9527
∙(无)
∙等 级:
∙
#6楼得分:
0回复于:
2008-05-0211:
08:
20
MARK
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙greatws
∙(蟀得拖网速)
∙等 级:
∙
#7楼得分:
2回复于:
2008-05-0212:
29:
43
引用3楼foxinhongyan的回复:
学习了~_T貌似很有用啊呵呵
不是很有用,_T是一个宏,如果定义了unicode,_T("x")就相当于L"x",这是宽字符
如果没有定义unicode,_T("x")就相当于"x"
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙lmy0525
∙(True)
∙等 级:
∙
#8楼得分:
0回复于:
2008-05-0514:
40:
44
“_T”:
找不到标识符改了之后又出现这个.什么原因呢?
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙greatws
∙(蟀得拖网速)
∙等 级:
∙
#9楼得分:
1回复于:
2008-05-0515:
01:
32
#include
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙lmy0525
∙(True)
∙等 级:
∙
#10楼得分:
0回复于:
2008-05-0614:
18:
35
在这谢谢各位了~!
~
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙ryebread
∙(ryebread)
∙等 级:
∙
#11楼得分:
0回复于:
2008-08-0510:
00:
36
FAQ:
Cannotconvertfrom'constchar[..]'to'LPCTSTR'
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙ihonk
∙(honkl)
∙等 级:
∙
#12楼得分:
0回复于:
2009-04-0217:
08:
33
mark下、、、
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙liaoyicong2
∙(liaoyicong2)
∙等 级:
∙
#13楼得分:
0回复于:
2009-06-1320:
40:
19
谢谢了
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙luochengyuan
∙(luochengyuan)
∙等 级:
∙
#14楼得分:
0回复于:
2010-08-1223:
31:
00
Mark
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙gucheng789
∙(叶孤城)
∙等 级:
∙
#15楼得分:
0回复于:
2010-11-2022:
05:
41
学习了
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
∙
∙LICHUNLI1022
∙(我是新手)
∙等 级:
∙
#16楼得分:
0回复于:
2010-12-0309:
37:
02
学习了
∙对我有用[0]
∙丢个板砖[0]
∙引用
∙举报
∙管理
∙TOP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游戏 字符串 由于 版本 不同 导致 错误 问题