`
daibalusu
  • 浏览: 341857 次
文章分类
社区版块
存档分类
最新评论

在VC6.0下设置Unicode编译环境

 
阅读更多

【前言1】最近又要忙一阵C代码了。忙起来,总比闲着好,尤其是我这种没压力没动力的猪头。

【前言2】遇到一个问题:下面的代码发送出去的消息是乱码,起初怀疑是没有memset,但是发现即使初始化后,也不行;然后怀疑是LPCTSTR的问题,明天去在试试

int ret ;
CString strReq;

//发送消息结构
MsgInfo Msg;

//接收消息结构

MsgInfo recMsg;

//服务名
strcpy(Msg.service, "SRVM");

strReq = strReq + "LOGIN:USER=" + (LPCTSTR)user + ",PSWD=" + (LPCTSTR)password;

strcpy(Msg.cmd, (LPCTSTR)strReq);

【link】http://blog.csdn.net/tingya/archive/2008/03/06/2154430.aspx

VC++ 6.0支持Unicode编程,但默认的是ANSI,所以开发人员只需要稍微改变一下编写代码的习惯便可以轻松编写支持UNICODE的应用程序。
  使用VC++ 6.0进行Unicode编程主要做以下几项工作:
1、为工程添加UNICODE和_UNICODE预处理选项。

  具体步骤:打开[工程]->[设置…]对话框,在C/C++标签对话框的“预处理程序定义”中去除_MBCS,加上_UNICODE,UNICODE。(注意中间用逗号隔开).

  在没有定义UNICODE和_UNICODE前,所有函数和类型都默认使用ANSI的版本;在定义了UNICODE和_UNICODE之后,所有的MFC类和Windows API都变成了宽字节版本了。

2、设置程序入口点

  因为MFC应用程序有针对Unicode专用的程序入口点,我们要设置entry point。否则就会出现连接错误。
  设置entry point的方法是:打开[工程]->[设置…]对话框,在Link页的Output类别的Entry Point里填上wWinMainCRTStartup。

3、使用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编码意识。

4、修改字符串运算问题

  一些字符串操作函数需要获取字符串的字符数(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开头的通用字符串操作函数。

六、举个Unicode编程的例子

第一步:
  打开VC++6.0,新建基于对话框的工程Unicode,主对话框IDD_UNICODE_DIALOG中加入一个按钮控件,双击该控件并添加该控件的响应函数:

void CUnicodeDlg::OnButtonUnicode() {TCHAR* str1=_T("ANSI和UNICODE编码试验");m_disp=str1;UpdateData(FALSE);}  添加静态文本框IDC_DISP,使用ClassWizard给该控件添加CString类型变量m_disp。使用默认ANSI编码环境编译该工程,生成Unicode.exe。
第二步:修改系统内码
  打开“控制面板”,单击“日期、时间、语言和区域设置”选项,在“日期、时间、语言和区域设置”窗口中继续单击“区域和语言选项”选项,弹出“区域和语言选项”对话框。在该对话框中,单击“高级”标签,将“非Unicode的程序的语言”选项改为“日语”,单击“应用”按钮,


弹出的对话框单击“是”,重新启动计算机使设置生效。
运行Unicode.exe程序并单击“Button1”按钮,看,静态文本框出现了乱码。

第三步:
  改为Unicode编码环境编译该工程,生成Unicode.exe。再次运行Unicode.exe程序并单击“Unicode”按钮。看到Unicode编码的优势了吧。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tingya/archive/2008/03/06/2154430.aspx

分享到:
评论

相关推荐

    MFC支持UNICODE的文件(MFC42UD)及VC6下设置UNICODE编译环境

    LINK:fatal error LNK1104:cannot open file "mfc42ud.lib" 这是因为缺少支持Unicode的文件;... 压缩包里提供了MFC支持unicode编码的lib文件和dll文件及说明文档,同时还有VC6下设置UNICODE编译环境的文档.

    VC6 win10可用绿色版

    经过测试后的可用绿色版以及常见问题解答: Windows10下VC6.0不能进行单步调试怎么办 在VC6.0下设置Unicode编译环境 支持Unicode的方法等

    大文本缓存读取Unicode逐行转UTF-8存储

    unicode编译环境。要求如下: 题目:用VC6.0实现对unicode格式的文本文件高效率按行读取 要求: (1)实现以下接口 BOOL OpenStringFile(CString path); BOOL ReadStringFile(&CString str); //一次读取文件中的一行...

    VC++6.0核心编程源码.rar

    在Microsoft Visual studio 6.0中,Microsoft的调试程序支持一个非常有用的特性,即你可以配置Watch窗口,以便始终都能向你显示线程的最后错误代码的号码和该错误的英文描述。通过选定Watch窗口中的一行,并键入“@...

    GB码转换为unicode码C++程序

    该程序用于GB码向unicode码转换,将unicode码以十六进制的形式输出到文本文件中,编译环境VC6.0。

    MFC编写的字符和Unicode相互转换

    1.可以将字符(包括中文和英文)和Unicode相互转换。2.将正整数转化为八进制、二进制、十进制、十六进制。3.键盘钩子,根据按键,显示字符、ACS码值、二进制数值。编译环境VC++6.0,系统:windows xp SP3

    wxWidgets-2.8.12-vc6-unicode-static.zip

    wxWidgets-2.8.12-vc6-unicode-static.zip wxWidgets 2.8.12 Visual Studio C++ 6.0静态编译库 CSDN发布地址:<http://blog.csdn.net/WinsenJiansbomber/article/details/50616754>

    MFC42UD.LIB和MFC42UD.DLL文件及UAFXCWD.PDB文件

    vc6.0 unicode 编译时需要的MFC42UD.LIB和MFC42UD.DLL文件及UAFXCWD.PDB文件

    程序中资源的操作示例演示

    使用vc6.0编译,由于resattach_detech使用了UNICODE,所以这个工程也必需使用UNICODE。 如果vc6.0的unicode有问题,则请参考 http://blog.csdn.net/jszj/archive/2008/08/23/2817552.aspx 。 作用:把其中的资源释放...

    j2k.lib在cximage600生成动态库时用到

    vc6.0 编译cximage600生成cximagecrtu.dll时要用到,编译时注意加入link项:kernel32.lib user32.lib gdi32.lib wininet.lib ../../png/Unicode_Release/png.lib ../../jpeg/Unicode_Release/jpeg.lib ../../zlib/...

    VC++常见安装调试错误

    通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: [Project] --> [Settings] --> 选择"C/C++"属性页, 在Category中选择Output,...

    清除VC++编译连接中间件(DelVCTemp)

    递归调用查询,清除VC++编译连接产生的中间件.程序支持自定义后缀,所以也可以设置成清理其它文件.其中对查找,文本写入,读出等功能的实现代码会是一个好例子.(工程使用VC++6.0+Unicode编码)

    mfc socket编程(平台在线离线状态互监控,聊天,文件传输)

    1、平台用的VS2013,代码支持VS默认的Unicode字符集和VC6.0平台的MBCS字符集。 2、代码具有详细的注释和注意事项解析。 3、由于编译后工程较大,不便上传,需用户自行新建工程添加至目录。

    录像屏幕的指定区域并保存为多帧Gif图像 使用CxImage类 程序+源码

    该程序(CxImageDemo.exe)使用VC6,使用CxImage类,UNICODE编译。 具有功能: 1、主打功能为录像屏幕的指定区域并保存为Gif图像; 2、浏览主流图片,但是gif图像不支持动态播放,只显示第一帧; 3、支持拖放图像...

    1.1版 录像屏幕的指定区域并保存为多帧Gif图像 使用CxImage类 程序+源码

    该程序(CxImageDemo.exe)使用VC6,使用CxImage类,UNICODE编译。 具有功能: 1、主打功能为录像屏幕的指定区域并保存为Gif图像; 2、浏览主流图片,但是gif图像不支持动态播放,只显示第一帧; 3、支持拖放图像...

    2.0版 录制屏幕的指定区域并保存为多帧Gif图像 使用CxImage类 程序+源码

    该程序(CxImageDemo.exe)使用VC6,使用CxImage类,UNICODE编译。 具有功能: 1、主打功能为录像屏幕的指定区域并保存为Gif图像; 2、浏览主流图片,但是gif图像不支持动态播放,只显示第一帧; 3、支持拖放图像...

    Led数码管 显示类

    (此版本理论上可用于MFC,Win32 SDK或其它Windows的环境,在Windows XP sp2下用vc6.0及vs2008编译、运行通过.) 第一作者: Jef 日期: 20100101 电子邮件: dungeonsnd@126.com 地址: 中国/江苏 版权: 1...

    vc源代码合集0951.rar

    vc源代码合集0951.rarvc源代码合集0951.rar 2012-06-12 11:54 80,235 (MSDN oct 2001)VC6 适用的最后一个版本[ISO].rar 2012-06-13 09:53 0 1.txt 2012-06-12 11:56 17,755 2011年北航计算机考研复试上机题.rar ...

    Led 显示 类 数码管 数码 数字

    (此版本理论上可用于MFC,Win32 SDK或其它环境,在Windows XP sp2下用vc6.0及vs2008编译、运行通过.) 第一作者: Jef 日期: 20091122 电子邮件: dungeonsnd@126.com 地址: 中国/江苏 版权: 1.您可以...

Global site tag (gtag.js) - Google Analytics