VC6创建UNICODE版Windows程序
来源:互联网 发布:python基础教程 百度云 编辑:程序博客网 时间:2024/05/07 08:01
V6中开发可运行在不同语言系统的Unicode程序,大致步骤如下:
1、Project — Settings — C/C++ Tab — Preprocessor definitions:中加入_UNICODE, UNICODE。这里的_UNICODE和UNICODE的区别在于:_UNICODE用于Windows头文件,UNICODE用于C运行时头文件。
2、将代码中的所有所有的 char 用TCHAR代替,所有char* 用LPTSTR代替。所有的win32字符串API用_tcs代替以前的str。比如strcpy 改成 _tcscpy,不过有的变化不是这样的。 另外所有的字符串常量放到_T()里(或_TEXT())里。
3、Project — Settings — Link — Category:Output — Entry-point symbol:中如果是exe执行文件添加 entry:wWinMainCRTStartup 程序入口,如果是dll添加:DllMainCRTStartup或什么也不添。
应用程序类型 进入点 C运行库启动函数
ANSI的GUI程序 WinMain WinMainCRTStartup
Unicode的GUI程序 wWinMain wWinMainCRTStartup
ANSI的CUI程序 main mainCRTStartup
UNICODE的CUI程序 wmain wmainCRTStartup
CUI是指控制台程序
4、所过编译时提示缺少 mfc42ud.dll 等文件时,可以去安装文件中找到这些文件复制到VC的安装目录 /VC98/MFC/Lib下即可。
依照上面四步做完以后,你就可以开发一个Unicode 程序了。如果想生成一个ASCII的程序,只需将第一步骤中的_UNICODE, UNICODE去掉即可。编译器会根据是否有此声明来编译相对的程序文件。
5、使用ANSI/Unicode通用数据类型
微软提供了一些ANSI和Unicode兼容的通用数据类型,我们最常用的数据类型有_T ,TCHAR,LPTSTR,LPCTSTR。
顺便说一下,LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在Win32 中以及其它的32位操作系统中,long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。P(pointer)表示这是一个指针;C (const)表示是一个常量;T(_T宏)表示兼容ANSI和Unicode,STR(string)表示这个变量是一个字符串。综上可以看出, LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。比如:
TCHAR* szText=_T(“Hello!”);TCHAR szText[]=_T(“I Love You”);LPCTSTR lpszText=_T(“大家好!”);使用函数中的参数最好也要有变化,比如:MessageBox(_T(“你好”));
其实,在上面的语句中,即使您不加_T宏,MessageBox函数也会自动把“你好”字符串进行强制转换。但我还是推荐您使用_T宏,以表示您有Unicode编码意识。
6、修改字符串运算问题
一些字符串操作函数需要获取字符串的字符数(sizeof(szBuffer)/sizeof(TCHAR)),而另一些函数可能需要获取字符串的字节数sizeof(szBuffer)。您应该注意该问题并仔细分析字符串操作函数,以确定能够得到正确的结果。
ANSI操作函数以str开头,如strcpy(),strcat(),strlen();
Unicode操作函数以wcs开头,如wcscpy,wcscpy(),wcslen();
ANSI/Unicode操作函数以_tcs开头 _tcscpy(C运行期库);
ANSI/Unicode操作函数以lstr开头 lstrcpy(Windows函数);
考虑ANSI和Unicode的兼容,我们需要使用以_tcs开头或lstr开头的通用字符串操作函数。
7、VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用
一、 在字符串前加一个L作用:
如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。
strlen("asd") = 3;
strlen(L"asd") = 6;
二、 _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式
如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD") 相当于 L"ABCD" ,这是宽字符串。
如果没有定义,那么_T宏不会在字符串前面加那个L,_T("ABCD") 就等价于 "ABCD"
三、TEXT,_TEXT 和_T 一样的
如下面三语句:
TCHAR szStr1[] = TEXT("str1");
char szStr2[] = "str2";
WCHAR szStr3[] = L("str3");
那么第一句话在定义了UNICODE时会解释为第三句话,没有定义时就等于第二句话。
但二句话无论是否定义了UNICODE都是生成一个ANSI字符串,而第三句话总是生成UNICODE字符串。
为了程序的可移植性,建议都用第一种表示方法。
但在某些情况下,某个字符必须为ANSI或UNICODE,那就用后两种方法。
- [转]VC6创建UNICODE版Windows程序
- VC6创建UNICODE版Windows程序
- VC6创建UNICODE版Windows程序
- VC中怎样创建UNICODE版Windows程序
- 在VC6.0中编译Unicode程序
- 在VC6.0编写Unicode程序
- vc6 unicode
- VC6 UNICODE
- Windows下的UNICODE、非UNICODE程序
- Windows下的UNICODE、非UNICODE程序
- VC6.0建立UNICODE程序的操作步骤
- VC6下将ANSI程序转化为UNICODE基本步骤
- VC6.0创建hello-World程序
- 用vc6写windows service程序
- 创建程序输出字符的unicode码
- VC6--Unicode编程总结
- vc6使用unicode
- vc6使用unicode
- Virtual 和 非 virtual
- 桃花夫人
- using的几种用法
- 试用“停表”高精度计时
- SlickEdit 使用 (转)
- VC6创建UNICODE版Windows程序
- 通配符 的使用
- 企业信息系统项目管理的问题点和对策
- 发个图看能不能
- Shell和Process 应用
- MySQL 存储引擎InnoDB/MYISAM
- String s1="a"和 Sting s2= new String("a")的区别
- Alexa工具栏研究
- Experiences on Couples of Issues of Using Condor.