windows网络编程Windows平台字符透明编程大总结.pdf
《windows网络编程Windows平台字符透明编程大总结.pdf》由会员分享,可在线阅读,更多相关《windows网络编程Windows平台字符透明编程大总结.pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、windows网络编程:Windows平台字符透明编程大总结 疯狂代码 http:/CrazyC Windows平台有用Unicode和不用区分:WinNT到Windows2003直使用Unicode;WindowsCE也是如此;Win95和Win98就非如此Windows编程对于使用也有各种情况:WindowsAPI处理方式、MFC处理方式、VC处理方式、COM处理方式本文对所有这些方式作了个整理总结期望员能够以本文为引子找到各种情况下处理透明编程思路方法 所谓透明编程主要针对Unicode和ANSI本来Unicode是比较简单个东西说起来个Unicode就是个无符号短整数而已(16位2个字
2、节)但是我相信大多数VC员都有这样困惑:VC和Win32API中那些用来实现ANSI和Unicode透明编程样子长得很像宏都在哪儿定义?它们的间关系如何?这就要求我们了解编程平台和操作系统支持ANSI和Unicode透明编程思路方法具体来说就是要了解VC运行库和Win32API是如何解决该问题更进步我们还应该了解COM解决该问题方式最后由于许多VC员使用MFC框架进行编程了解MFC框架处理该问题思路方法也有必要 本文内容在ATL技术内幕第 2章也有比较详细讲述尤其是有关COM内容但是该书没有讲VC相关内容;也没有将内容整理得更清晰些(尤其是没有给出各种情况下表格以供查找)所以本文将重点放在VC
3、和Windows针对透明编程采用思路方法归纳和比较上 本文可以作为个出发点有了本文介绍基础的后想要更多地了解BSTR细节可以看ATL技术内幕;想要更多地了解针对透明编程问题可以看其他相关资料 2.VC对透明编程 首先要说是对宽支持其实是ANSIC标准部分用以支持多字节表示个宽和Unicode并不是回事Unicode只是宽能支持种编码方式但是由于我们现在主要考虑Unicode不妨把这两种东西当作同义 2.1.宽定义 在ANSI中个(char)长度为个字节(Byte)使用Unicode时个应该占据个字(Word)VC在wchar.h头文件中定义了最基本宽类型wchar_t:typedefunsig
4、nedwchar_t;从这里我们可以清楚地看到所谓宽就是无符号短整数 2.2.常量宽串 对C员而言构造串常量是项经常性工作那么如何构造宽串常量呢?很简单只要在串常量前加上个大写L就可以了比如:L“Hello,world!”这个L非常重要只有带上它编译器才知道你要将串存成每个1个字还要注意在L和串的间不能有空格 2.3.宽串库 为了操作宽串VC专门定义了套比如求宽串长度是 size_t_cdelwchlen(constwchar_t*)为什么要专门定义这些呢?最根本原因是ANSI下串都是以“0”来标识串尾许多串正确操作均以此为基础进行而我们知道在宽情况下个在内存中要占据个字空间这就会使操作ANS
5、I串无法正确操作以“Hello”串为例在宽下它 5个是:0 x00480 x00650 x006c0 x006c0 x006f 在内存中实际排列是:480065006c006c006f00 Page 于是ANSI串如strlen在碰到第个48后00时就会认为串到尾了用strlen对宽串求长度结果就永远会是1!2.4.用宏实现对ANSI和Unicode透明编程 看到这儿想必员都会感到沮丧:“完了两套串!”不用说针对ANSI和Unicode维护两套代码是令人讨厌事情就算是自己在套代码中写些预编译语句执行条件编译也是非常麻烦事要用串地方实在是太多了为了减轻大家编程负担VC定义了系列宏帮助实现对ANS
6、I和Unicode透明编程从上面讨论我们可以看到要做工作是两个:透明定义和常量串;2透明串下面就分别讲用于这两个方面宏 2.4.1.透明定义和常量串 该工作主要是由tchar.h头文件中定义若干宏完成根据“_UNICODE”(注意有下划线)定义和否这些宏展开为ANSI或Unicode(串)有兴趣者可以去查看头文件这里我做了如下归纳:宏:宏未定义_UNICODE(ANSI)定义了_UNICODE(Unicode)_TCHARcharwchar_t _TSCHARsignedcharwchar_t _TUCHARunsignedcharwchar_t _TXCHARcharwchar_t TCHA
7、Rcharwchar_t 常量串宏:宏未定义_UNICODE (ANSI常量串)定义了_UNICODE (Unicode常量串)_T(x)xL#x _Tx_T(x)_TEXTx_T(x)*注意“L#x”中“#”虽然看起来很怪却是ANSIC标准预处理语法它叫做“粘贴符号(tokenpaste)”表示将前面L添加到宏参数上也就是说如果我们写了个_T(“SoftwareDepartment”)展开后即为L“SoftwareDepartment”为了方便可以简单地整理总结两条规则:*定义用TCHAR *定义常量串用_T 2.4.2.透明串 VC实现透明串也是定义了系列宏不过这些宏数量太多了没有办法把它
8、们都列在这里就象征性地列出些给大家个印象:宏未定义_UNICODE (ANSI串)定义了_UNICODE (Unicode串)_tcschrstrchrwcschr _tcscmpstrcmpwcscmp _tcslenstrlenwcslen 我给大家建议是:当你需要具体某个时候最好去查tchar.h或者查某些专门讲VC运行库书 好了VC东西大致就是这样下面讲Windows处理思路方法 3.Win32API对透明编程 3.1.Win32API定义数据类型 首先Win32API中定义了若干自己数据类型所谓自己定义无非就是用些宏把C中数据类型包装起来而已(确实是C数据类型Win32API是按C方
9、式定义)对数据类型定义基本上都在winnt.h头文件中 Page 最基本是两种数据类型分别对应8位单字节和16位Unicode:typedefcharCHAR typedefunsignedWCHAR 另外Windows还定义了6种8位串指针、6种16位串指针、4种8位常量串指针、4种16位常量串指针这里归纳如下:数据类型ANSIUNICODE内部数据类型 CHAR8位char WCHAR16位unsigned PCHARCHAR*char*PCH&LPCHCHAR*char*PSTR&NPSTR&LPSTRCHAR*char*PCCH&LPCCHCONSTCHAR*constchar*PCS
10、TR&LPCSTRCONSTCHAR*constchar*PWCHARWCHAR*unsigned*PWCH&LPWCHWCHAR*unsigned*PWSTR&LPWSTR&NWPSTR*WCHAR*unsigned*PCWCH&LPCWCHCONSTWCHAR*constunsigned*PCWSTR&LPCWSTRCONSTWCHAR*constunsigned*注意“NWPSTR”并没有写错确实是“NWP”本来我也认为应该是“NPW”(近指针)*所谓“远指针”“近指针”在32位编程环境下已经没有意义了 由于这些数据类型都是Windows内部分别针对ANSI和Unicode定义在编程中当
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windows 网络 编程 平台 字符 透明 总结
限制150内