欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    windows网络编程Windows平台字符透明编程大总结.pdf

    • 资源ID:70019734       资源大小:180.19KB        全文页数:8页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    windows网络编程Windows平台字符透明编程大总结.pdf

    windows网络编程:Windows平台字符透明编程大总结 疯狂代码 http:/CrazyC Windows平台有用Unicode和不用区分:WinNT到Windows2003直使用Unicode;WindowsCE也是如此;Win95和Win98就非如此Windows编程对于使用也有各种情况:WindowsAPI处理方式、MFC处理方式、VC处理方式、COM处理方式本文对所有这些方式作了个整理总结期望员能够以本文为引子找到各种情况下处理透明编程思路方法 所谓透明编程主要针对Unicode和ANSI本来Unicode是比较简单个东西说起来个Unicode就是个无符号短整数而已(16位2个字节)但是我相信大多数VC员都有这样困惑:VC和Win32API中那些用来实现ANSI和Unicode透明编程样子长得很像宏都在哪儿定义?它们的间关系如何?这就要求我们了解编程平台和操作系统支持ANSI和Unicode透明编程思路方法具体来说就是要了解VC运行库和Win32API是如何解决该问题更进步我们还应该了解COM解决该问题方式最后由于许多VC员使用MFC框架进行编程了解MFC框架处理该问题思路方法也有必要 本文内容在ATL技术内幕第 2章也有比较详细讲述尤其是有关COM内容但是该书没有讲VC相关内容;也没有将内容整理得更清晰些(尤其是没有给出各种情况下表格以供查找)所以本文将重点放在VC和Windows针对透明编程采用思路方法归纳和比较上 本文可以作为个出发点有了本文介绍基础的后想要更多地了解BSTR细节可以看ATL技术内幕;想要更多地了解针对透明编程问题可以看其他相关资料 2.VC对透明编程 首先要说是对宽支持其实是ANSIC标准部分用以支持多字节表示个宽和Unicode并不是回事Unicode只是宽能支持种编码方式但是由于我们现在主要考虑Unicode不妨把这两种东西当作同义 2.1.宽定义 在ANSI中个(char)长度为个字节(Byte)使用Unicode时个应该占据个字(Word)VC在wchar.h头文件中定义了最基本宽类型wchar_t:typedefunsignedwchar_t;从这里我们可以清楚地看到所谓宽就是无符号短整数 2.2.常量宽串 对C员而言构造串常量是项经常性工作那么如何构造宽串常量呢?很简单只要在串常量前加上个大写L就可以了比如:L“Hello,world!”这个L非常重要只有带上它编译器才知道你要将串存成每个1个字还要注意在L和串的间不能有空格 2.3.宽串库 为了操作宽串VC专门定义了套比如求宽串长度是 size_t_cdelwchlen(constwchar_t*)为什么要专门定义这些呢?最根本原因是ANSI下串都是以“0”来标识串尾许多串正确操作均以此为基础进行而我们知道在宽情况下个在内存中要占据个字空间这就会使操作ANSI串无法正确操作以“Hello”串为例在宽下它 5个是:0 x00480 x00650 x006c0 x006c0 x006f 在内存中实际排列是:480065006c006c006f00 Page 于是ANSI串如strlen在碰到第个48后00时就会认为串到尾了用strlen对宽串求长度结果就永远会是1!2.4.用宏实现对ANSI和Unicode透明编程 看到这儿想必员都会感到沮丧:“完了两套串!”不用说针对ANSI和Unicode维护两套代码是令人讨厌事情就算是自己在套代码中写些预编译语句执行条件编译也是非常麻烦事要用串地方实在是太多了为了减轻大家编程负担VC定义了系列宏帮助实现对ANSI和Unicode透明编程从上面讨论我们可以看到要做工作是两个:透明定义和常量串;2透明串下面就分别讲用于这两个方面宏 2.4.1.透明定义和常量串 该工作主要是由tchar.h头文件中定义若干宏完成根据“_UNICODE”(注意有下划线)定义和否这些宏展开为ANSI或Unicode(串)有兴趣者可以去查看头文件这里我做了如下归纳:宏:宏未定义_UNICODE(ANSI)定义了_UNICODE(Unicode)_TCHARcharwchar_t _TSCHARsignedcharwchar_t _TUCHARunsignedcharwchar_t _TXCHARcharwchar_t TCHARcharwchar_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实现透明串也是定义了系列宏不过这些宏数量太多了没有办法把它们都列在这里就象征性地列出些给大家个印象:宏未定义_UNICODE (ANSI串)定义了_UNICODE (Unicode串)_tcschrstrchrwcschr _tcscmpstrcmpwcscmp _tcslenstrlenwcslen 我给大家建议是:当你需要具体某个时候最好去查tchar.h或者查某些专门讲VC运行库书 好了VC东西大致就是这样下面讲Windows处理思路方法 3.Win32API对透明编程 3.1.Win32API定义数据类型 首先Win32API中定义了若干自己数据类型所谓自己定义无非就是用些宏把C中数据类型包装起来而已(确实是C数据类型Win32API是按C方式定义)对数据类型定义基本上都在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*PCSTR&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定义在编程中当然要避免使用把它们列在这里是为了方便大家参考 3.2.Win32API中对ANSI和Unicode透明编程 我们还是从两个方面来讲:透明定义和常量串;透明串 3.2.1.透明定义和常量串 这里把winnt.h头文件中实现透明定义和常量串部分摘出来相信对大家理解会有所帮助(加黑部分定义了通用定义):/NeutralANSI/UNICODEtypesandmacros /#defUNICODE/以下是Unicode相关定义#ndef_TCHAR_DEFINED typedefWCHARTCHAR,*PTCHAR;/定义基本通用类型#_TCHAR_DEFINED#end/*!_TCHAR_DEFINED*/typedefLPWSTRLPTCH,PTCH;/定义各种通用串指针 typedefLPWSTRPTSTR,LPTSTR;typedefLPCWSTRLPCTSTR;typedefLPWSTRLP;/奇怪为什么要定义它?Page#_TEXT(quote)L#quote/定义串常量宏#/*UNICODE*/以下是ANSI相关定义#ndef_TCHAR_DEFINED typedefcharTCHAR,*PTCHAR;/定义基本通用类型#_TCHAR_DEFINED#end/*!_TCHAR_DEFINED*/typedefLPSTRLPTCH,PTCH;/定义各种通用串指针 typedefLPSTRPTSTR,LPTSTR;typedefLPCSTRLPCTSTR;#_TEXT(quote)quote/定义串常量宏#end/*UNICODE*/#TEXT(quote)_TEXT(quote)/定义另个串常量宏 从这段我们可以看出winnt.h不过就是根据是否定义了UNICODE(没有下划线)利用Windows内部定义数据类型进行个条件编译 下面用表格形式将以上内容做个整理总结以方便大家查阅:宏未定义UNICODE (ANSI和字串)定义了UNICODE (Unicode和字串)TCHARcharWCHAR PTCHARchar*WCHAR*PTCH&LPTCHLPSTRLPWSTR PTSTR&LPTSTRLPSTRLPWSTR LPCTSTRLPCSTRLPCWSTR _TEXT(quote)quoteL#quote TEXT(quote)quoteL#quote *注意LP是专门针对Unicode定义所以无法用于透明编程(我不知道为什么要定义它)故未将它列在表中 比较VC和Windows定义我们可以得出如下结论:VC没有直接定义指针类型Windows直接定义了指针类型;VC和Windows都定义了TCHAR所以我们使用TCHAR兼容性最好;也许我们没有必要直接使用Windows定义指针类型使用TCHAR*就可以了;Windows定义类型如此的多可能和写Windows开发组较多标准不有关由于要兼容历史上只好定义多些我们没有必要去使用那些杂乱定义 3.2.2.透明串 Win32API中又定义了套串总来说它解决思路方法是对ANSI和Unicode分别定义了区别(在Kernel32.dll中实现)比如求串长度就分别是:WINBASEAPIWINAPIlstrlenA(LPCSTRlpString);WINBASEAPIWINAPIlstrlenW(LPCWSTRlpString);然后另个宏根据是否定义了“UNICODE”分别展开为这两个:#defUNICODE Page#lstrlenlstrlenW#lstrlenlstrlenA#end/!UNICODE 又是堆!虽然Win32API并没有实现所有串我还是不愿意再记它们我认为VC运行库就够好了想要了解Windows可以自己到MSDN里面去找 4.COM对透明编程 好了现在再来说下COM接口和OLE中类型进行COM接口编程时我们经常会接触OLESTR的类东西它们又是如何会事呢?大多数COM和OLE中使用数据类型都是在baype.h和wtypes.h中定义我将有关内容整理总结如下:宏未定义OLE2ANSI (Unicode和字串)定义了OLE2ANSI (ANSI和字串)OLECHARWCHARchar OLESTR(x)L#xx LPOLESTROLECHAR_RPC_FAR*LPSTR LPCOLESTRconstOLECHAR_RPC_FAR*LCPSTR 首先我们可以看到在定义LPOLESTR和LPCOLESTR时利用了WIN32API定义(那个看起来很深奥“_RPC_FAR”只是个用于远程时规定约定宏定义在rpc.h头文件中)其次我们看到OLESTR的类宏目也是为了实现对ANSI和UNICODE透明编译根据是否定义了OLE2ANSI来选择编译ANSI版本还是UNICODE版本真不知道定义这么多宏做什么也许是各个小组独立开发各自用各自东西原因 要了解COM中串使用更多细节请参考ATL技术内幕 5.MFC对透明编程 最后讲讲MFC如何处理该问题MFC处理很简单它只是利用了VC运行库处理方式具体来说就是从Afxw_32.h头文件152行开始有这么几句:#ndef_INC_TCHAR#/该头文件包含了VC串透明编程所需内容#end#def_MBCS#ndef_INC_MBCTYPE#end#ndef_INC_MBSTRING#end#end 也就是说在MFC中我们应该使用VC串透明编程方式 但是要注意是对于BSTR这个宏(该宏主要在Oleauto.h头文件中声明自动化接口中使用)MFC根据OLE2ANSI是否被定义有其区别展开(在Afx.h)中:#ndef_OLEAUTO_H_#defOLE2ANSI typedefLPSTRBSTR;/用Windows类型定义BSTR#typedefLPWSTRBSTR;/用Windows类型定义BSTR#end#end 6.常见问题(Q&A)最后根据我体会讲些大家有可能感到迷惑问题(当然也许大家认为这些问题都很简单)Q1:VC处理方式和Win32API处理方式我该用哪个?A1:这两种思路方法关系是这样:Win32API给出是操作系统内带支持而VC可以被看做是和操作系统相关性较小种方式(虽然微软做了很多扩展把它搞得和操作系统有了不少相关性)所以如果你要考虑以后在各平台上移植还是少用操作系统内部直接支持东西为妙 Page Q2:我们什么时候定义_UNICODE或是UNICODE?A2:调整ProjectSetting时按Alt+F7选择“C/C”标签将“_UNICODE”或“UNICODE”添加在“Preprocessordefinitions”编辑框中就可以了 Q3:那些定义串常量宏我该用哪个?A3:想必大家也注意到了为了透明转换常量串WINDOWS和VC都定义了各自宏:Windows:_TEXT和TEXT VC:_T、_T和_TEXT 这 5个宏最容易让员迷惑了它们仅仅是不加下划线加个下划线、两个下划线问题其实只要你是开发Windows上应用用哪个宏没有什么关系考虑到不和平台关系过于紧密以及书写长度_T可能是个比较好选择 Q4:我如何在Debug状态下观察Unicode串值?A4:般说来如果你把个Unicode串变量名拖到Watch窗口中你看到是个32位16进制值也就是说是个指针地址而我们想看到是内存中存串如何办?你在这个变量名后面加上“,su”就可以了 对ANSI和Unicode透明编程问题尽我了解讲了这么多希望大家觉得有所帮助大家如果发现有遗漏和谬误的处请指正!2009-2-12 3:46:30 疯狂代码 http:/CrazyC

    注意事项

    本文(windows网络编程Windows平台字符透明编程大总结.pdf)为本站会员(qwe****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开