青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 126,  comments - 73,  trackbacks - 0

一、TCHAR,LPTSTR,LPCTSTR:定義于WinNT.h

//
// Neutral ANSI/UNICODE types and macros
//
#ifdef UNICODE // r_winnt
#ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef LPUWSTR PUTSTR, LPUTSTR;
typedef LPCUWSTR PCUTSTR, LPCUTSTR;
typedef LPWSTR LP;
#define __TEXT(quote) L##quote????? // r_winnt
#else?? /* UNICODE */?????????????? // r_winnt
#ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */
typedef LPSTR LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
#define __TEXT(quote) quote???????? // r_winnt
#endif /* UNICODE */??????????????? // r_winnt

類似的定義出現(xiàn)于Wtypes.h:


typedef char CHAR;
typedef /* [string] */ CHAR *LPSTR;
typedef /* [string] */ const CHAR *LPCSTR;
#ifndef _WCHAR_DEFINED
#define _WCHAR_DEFINED
typedef wchar_t WCHAR;
typedef WCHAR TCHAR;
#endif // !_WCHAR_DEFINED
typedef /* [string] */ WCHAR *LPWSTR;
typedef /* [string] */ TCHAR *LPTSTR;
typedef /* [string] */ const WCHAR *LPCWSTR;
typedef /* [string] */ const TCHAR *LPCTSTR;


注意在TCHAR.h, WinNT.h中都定義了TCHAR,它們是靠#ifdef _TCHAR_DEFINED來(lái)判斷的。在VC6.0中:

#include <WINNT.h>只在WINDEF.H中出現(xiàn)過(guò)。
#include <windef.h>出現(xiàn)在 Windows.h中。
#include <windef.h>、#include <TCHAR.h>出現(xiàn)在ATL/INCLUDE/ATLBASE.H中

TCHAR.h中重新定義了標(biāo)準(zhǔn)C庫(kù)的很多字符串處理函數(shù)的宏,只要在工程中定義或取消UNICODE和_UNICODE,就可以在多字節(jié)字符串和UNICODE間互相轉(zhuǎn)換。按Win32編程要求的"Think In UNICODE",TCHAR.h中的函數(shù)應(yīng)該是經(jīng)常用到的。

二、BSTR(BASIC String):定義于WTypes.h

#if defined(_WIN32) && !defined(OLE2ANSI)
??? typedef WCHAR OLECHAR;
??? typedef /* [string] */ OLECHAR *LPOLESTR;
??? typedef /* [string] */ const OLECHAR *LPCOLESTR;
#?? define OLESTR(str) L##str
#else
??? typedef char????? OLECHAR;
??? typedef LPSTR???? LPOLESTR;
??? typedef LPCSTR??? LPCOLESTR;
#?? define OLESTR(str) str
#endif
typedef /* [wire_marshal] */ OLECHAR *BSTR;


可以看到,BSTR實(shí)際上還是一個(gè)C-style的寬字符串(如果定義了OLE2ANSI,就是C字符串了,但很少用到,因?yàn)樵贠LE接口中傳遞時(shí)都是寬字符串),只不過(guò)在使用BSTR時(shí),得用到特殊的申請(qǐng)/釋放函數(shù)組。因?yàn)锽STR指針位置前面有一個(gè)四字節(jié)的數(shù)據(jù),存儲(chǔ)的是BSTR的長(zhǎng)度。就是這個(gè)原因,我們不能把OLECHAR*當(dāng)作BSTR來(lái)用,而編譯器在遇到這種方式時(shí)還不報(bào)錯(cuò)!

在MFC程序中不用BSTR時(shí),可以在stdafx.h中所有#include之前加一行:
#define _AFX_NO_BSTR_SUPPORT

在ATL對(duì)象的接口定義中,無(wú)論是雙接口還是自定義接口,我們一般看不到TCHAR等定義,我們看到的是BSTR(雙接口時(shí)的VARIANT,如果是BSTR類型,可以直接用BSTR的),這要求我們作一些處理。對(duì)于傳入的參數(shù),一般的做法是將參數(shù)賦給一個(gè)串處理類。對(duì)于傳出的參數(shù),一般的方法是內(nèi)部先處理,最后將字符串復(fù)制一份傳出去。

三、CComBSTR

CComBSTR是ATL庫(kù)中的一個(gè)BSTR封裝類,提供了一些簡(jiǎn)單的函數(shù),支持各類字符串到BSTR的轉(zhuǎn)換,但沒(méi)有格式化、搜索、子串處理等基本功能。功能太過(guò)簡(jiǎn)單使得這個(gè)類可以說(shuō)是一個(gè)雞脅,只能作一個(gè)轉(zhuǎn)換工具用。奇怪的是在Visaul .NET 2003版本中還是沒(méi)什么大的改進(jìn),我本以為M$會(huì)把CString的所有功能都搬進(jìn)去的。

在M$的《用 CComBSTR 進(jìn)行編程》提到了一些使用CComBSTR時(shí)要注意的一些問(wèn)題。

四、_bstr_t

_bstr_t是一個(gè)與ATL無(wú)關(guān)的COM的支持類,這個(gè)類定義在comutil.h文件中(同時(shí)還定義有一個(gè)_variant_t類)。這個(gè)類也是一個(gè)功能與CComBSTR類似,主要用于轉(zhuǎn)換是,也是一個(gè)功能不怎么強(qiáng)的類。

在comutil.h還定義了兩個(gè)函數(shù)用于在標(biāo)準(zhǔn)C字符串與BSTR間的轉(zhuǎn)換,可以說(shuō)這是個(gè)底層函數(shù)。程序員對(duì)TCHAR作一次分解就可以寫出TCHAR適用的程序了。

namespace _com_util {
??? // Convert char * to BSTR
??? //
??? BSTR __stdcall ConvertStringToBSTR(const char* pSrc) ;
??? // Convert BSTR to char *
?? //
?? char* __stdcall ConvertBSTRToString(BSTR pSrc) ;
}

五、CString/CStringA/CStringW

CString在VC6.0以前是MFC的一個(gè)類,要想在COM中使用,就得加上那個(gè)900K的MFC42.DLL。可能是MFC下的CString太好用了(:p,不要打我),所以M$干脆把這個(gè)類搬到ATL中。在Visual C++.NET中CStringT(在CStringT.h中實(shí)現(xiàn))成為ATL的一個(gè)模板方式的類,只是將以前在MFC中的方法搬了過(guò)來(lái);而CString定義在afxstr.h中:

// MFC-enabled compilation. Use MFC memory management and exceptions;
// also, use MFC module state.
// Don't import when MFC dll is being built
#if !defined(_WIN64) && defined(_AFXDLL)
#if defined(_MFC_DLL_BLD)
template class ATL::CSimpleStringT< char, true >;
template class ATL::CStringT< char, StrTraitMFC_DLL< char > >;
template class ATL::CSimpleStringT< wchar_t, true >;
template class ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > >;
#else
template class __declspec(dllimport) ATL::CSimpleStringT< char, true >;
template class __declspec(dllimport) ATL::CStringT< char, StrTraitMFC_DLL< char > >;
template class __declspec(dllimport) ATL::CSimpleStringT< wchar_t, true >;
template class __declspec(dllimport) ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > >;
#if defined(_NATIVE_WCHAR_T)
template class __declspec(dllimport) ATL::CSimpleStringT< unsigned short, true >;
template class __declspec(dllimport) ATL::CStringT< unsigned short, StrTraitMFC_DLL< unsigned short > >;
#endif // _NATIVE_WCHAR_T
#endif // _MFC_DLL_BLD
typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;
#else
typedef ATL::CStringT< wchar_t, StrTraitMFC< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
#endif // !_WIN64 && _AFXDLL


關(guān)于ATL7.0中CString的用法,在M$的《自 Visual C++ 6.0 以來(lái) ATL 7.0 和 MFC 7.0 中的重大更改》中有提到:從 BSTR 轉(zhuǎn)換到 CString

在 Visual C++ 6.0 中,使用下面的代碼是可以接受的:

BSTR bstr = SysAllocString(L"Hello");
CString str = bstr;
SysFreeString(bstr);對(duì)于 Visual C++ .NET 下的新項(xiàng)目,這將在 ANSI 版本下導(dǎo)致下面的錯(cuò)誤error C2440: 'initializing' : cannot convert from 'BSTR' to
'ATL::CStringT<BaseType,StringTraits>'
現(xiàn)在有 CString 的 UNICODE 和 ANSI 版本(CStringW 和 CStringA)。若要標(biāo)記任何由隱式轉(zhuǎn)換導(dǎo)致的不必要的系統(tǒng)開(kāi)銷,采用反向類型(如帶 UNICODE 參數(shù)的 CStringA,或者帶 ANSI 參數(shù)的 CStringW)的構(gòu)造函數(shù)現(xiàn)在在 stdafx.h 中被使用下面的項(xiàng)標(biāo)記為顯式的:

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS

若要避免此錯(cuò)誤,請(qǐng)執(zhí)行下列操作之一:

使用 CStringW 以避免轉(zhuǎn)換:
???
BSTR bstr = SysAllocString(L"Hello");
??? CStringW str = bstr;
??? SysFreeString(bstr);

顯式調(diào)用該構(gòu)造函數(shù):
??? BSTR bstr = SysAllocString(L"Hello");
??? CString str = CString(bstr);
??? SysFreeString(bstr);

從 stdafx.h 中移除 #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 行。


在VC6.0及以前,很多程序員都做過(guò)將MFC中的CString,這種在網(wǎng)上很多。我看到的一個(gè)很完整的是gosh的gd::CString,網(wǎng)址是
http://www.codeproject.com/soap/serialize_xml.asp 。據(jù)這位老兄自己說(shuō),他自己還沒(méi)有VC 6.0編譯器。

六、std::string和std::wstring

std::string在我看來(lái)是std::vector<char>。但這個(gè)類可以說(shuō)是一個(gè)有史以來(lái)計(jì)算機(jī)程序員對(duì)字符串處理類的一個(gè)總結(jié),它的算法應(yīng)該是沒(méi)得說(shuō)的。

七、字符串(類)間的轉(zhuǎn)換

以上各類字符串間的轉(zhuǎn)換從概念上有兩種方式,第一種是已經(jīng)有的轉(zhuǎn)換接口,另一種是基于某一個(gè)中間格式作轉(zhuǎn)換,其實(shí)第一種實(shí)現(xiàn)也是基于第二種的。

char 與 wchar_t 間的轉(zhuǎn)換:
簡(jiǎn)單地說(shuō),是兩個(gè)Win32函數(shù):WideCharToMultiByte和MultiByteToWideChar。當(dāng)然中間還涉及到代碼頁(yè)和線程代碼頁(yè)等參數(shù)。如果用標(biāo)準(zhǔn)C函數(shù)wctomb和mbtowc也可以。

在M$的《自Visual C++6.0以來(lái)ATL7.0和MFC7.0中的重大更改》中有提到:字符串轉(zhuǎn)換

Visual C++ 6.0 中 ATL 3.0 和 ATL 3.0 以前的 ATL 版本中,使用 atlconv.h 中的宏的字符串轉(zhuǎn)換始終是使用系統(tǒng) (CP_ACP) 的 ANSI 代碼頁(yè)執(zhí)行的。從 Visual C++ .NET 中的 ATL 7.0 開(kāi)始,字符串轉(zhuǎn)換將使用當(dāng)前線程的默認(rèn) ANSI 代碼頁(yè)執(zhí)行,除非定義了 _CONVERSION_DONT_USE_THREAD_LOCALE(此情況下,如以前一樣使用系統(tǒng)的 ANSI 代碼頁(yè))。

請(qǐng)注意,字符串轉(zhuǎn)換類(如 CW2AEX)使您得以將用于轉(zhuǎn)換的代碼頁(yè)傳遞給它們的構(gòu)造函數(shù)。如果未指定代碼頁(yè),這些類使用與宏相同的代碼頁(yè)。

有關(guān)更多信息,請(qǐng)參見(jiàn) ATL 和 MFC 字符串轉(zhuǎn)換宏。

COM程序中,接口一般都是BSTR,所以無(wú)論在編寫COM組件時(shí)還是使用組件時(shí),轉(zhuǎn)為BSTR和從BSTR轉(zhuǎn)出都可能遇到。如果全部采用UNICODE,麻煩要少一些,如果使用到了char或std::string,麻煩就不少了。但一般而言,我們有以下方法可以用:

在接口(組件)內(nèi)部,全部用UNICODE處理。將傳入的BSTR轉(zhuǎn)換為std::wstring、gd:CString或是其它的什么類,在內(nèi)部成員變量聲明時(shí)用同樣的類,內(nèi)部處理時(shí)不用管外面,生成結(jié)果時(shí)用一個(gè)CComBST或是_bstr_t類作一次轉(zhuǎn)換就可以了。

在接口外部,調(diào)用COM組件的接口函數(shù)前,將字符串用_bstr_t或者comutil.h的函數(shù)作一個(gè)轉(zhuǎn)換,傳入組件進(jìn)行處理;傳出時(shí),作一個(gè)反向的轉(zhuǎn)換。

非COM程序中,接口一般用TCHAR*,這種方式的代價(jià)最小。



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=245116

posted on 2009-12-07 17:43 我風(fēng) 閱讀(2022) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

文章檔案

相冊(cè)

收藏夾

C++

MyFavorite

搜索

  •  

積分與排名

  • 積分 - 328492
  • 排名 - 75

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产伦精品一区二区三区照片91| 欧美激情在线免费观看| 国内揄拍国内精品少妇国语| 日韩视频第一页| 国产精品另类一区| 欧美高清在线视频观看不卡| 欧美久久一区| 国产精品久久久久77777| 国产女人精品视频| 国产欧美一区二区三区国产幕精品 | 欧美成人激情视频免费观看| 美女日韩在线中文字幕| 欧美精品导航| 国产精品―色哟哟| 在线不卡欧美| 亚洲男女自偷自拍| 久久综合伊人77777蜜臀| 亚洲国产视频直播| 日韩亚洲精品视频| 欧美夜福利tv在线| 欧美电影在线观看| 国产欧美精品va在线观看| 有坂深雪在线一区| 亚洲欧美在线一区| 欧美国产精品中文字幕| 夜夜夜久久久| 久久综合中文| 国产欧美一区二区三区在线看蜜臀 | 久久精彩视频| 亚洲精品一区二区三区不| 欧美亚洲免费在线| 欧美精品www| 激情国产一区二区| 午夜视频一区在线观看| 亚洲激情在线| 久久精品一区二区三区中文字幕| 欧美美女喷水视频| 亚洲国产精品久久久久婷婷老年 | 欧美视频不卡| 亚洲国产一区二区在线| 久久国产成人| 亚洲伊人久久综合| 欧美特黄一区| 亚洲免费大片| 亚洲国产高清aⅴ视频| 久久精品国产精品亚洲精品| 国产精品天天看| 亚洲欧美电影院| 欧美 日韩 国产在线| 亚洲欧美中文日韩在线| 欧美午夜精品| 亚洲最黄网站| 亚洲激精日韩激精欧美精品| 久久综合中文色婷婷| 一本大道久久a久久精品综合| 欧美成人dvd在线视频| 性做久久久久久久久| 国产精品美女主播在线观看纯欲| 99热免费精品在线观看| 亚洲成人在线免费| 欧美视频一二三区| 亚洲婷婷综合久久一本伊一区| 欧美77777| 久久久人人人| 亚洲国产精品久久久久久女王| 鲁大师成人一区二区三区| 欧美在线观看视频一区二区三区| 国产日本欧美一区二区三区在线| 欧美一级网站| 久久精彩视频| 最新高清无码专区| 91久久国产精品91久久性色| 欧美第一黄色网| 亚洲午夜小视频| 亚洲欧美日韩精品久久亚洲区| 国产日本欧美在线观看| 蜜桃av一区二区三区| 免费观看成人| 亚洲图片欧洲图片av| 午夜国产不卡在线观看视频| 一区二区亚洲精品| 亚洲日本成人在线观看| 国产精品久久久久99| 久久国产一二区| 另类图片国产| aⅴ色国产欧美| 亚洲在线电影| 亚洲国产人成综合网站| 日韩亚洲不卡在线| 国产亚洲视频在线| 亚洲黑丝在线| 国产欧美日韩亚洲| 欧美激情aaaa| 国产精品欧美日韩| 蜜臀久久99精品久久久画质超高清| 欧美成年网站| 欧美一区二区视频免费观看| 久久综合影视| 欧美一区二区大片| 欧美成人午夜视频| 欧美一区二区三区男人的天堂| 久久久久久国产精品mv| 一区二区三区国产盗摄| 欧美一区二区三区四区在线| 91久久夜色精品国产九色| 一区二区免费看| 亚洲国产成人久久综合一区| 亚洲一区亚洲| 在线亚洲自拍| 一区二区三区视频在线| 久久精品道一区二区三区| 久久频这里精品99香蕉| 亚洲午夜久久久久久久久电影网| 久久久999国产| 性欧美18~19sex高清播放| 欧美wwwwww| 久久夜色精品国产噜噜av| 欧美性猛交xxxx乱大交蜜桃| 欧美国产精品v| 激情成人综合网| 亚洲字幕一区二区| 亚洲手机成人高清视频| 久热精品在线视频| 久久婷婷亚洲| 国产手机视频一区二区| 中文亚洲免费| 亚洲天堂网在线观看| 欧美激情欧美狂野欧美精品| 欧美成人a∨高清免费观看| 国产在线乱码一区二区三区| 亚洲在线观看免费视频| 亚洲最新合集| 欧美日韩国产色站一区二区三区| 欧美高清视频| 亚洲高清视频在线观看| 欧美一区二区黄色| 久久精品一本| 狠狠色丁香婷婷综合| 欧美在线中文字幕| 久久青青草原一区二区| 黄色成人在线观看| 久久视频精品在线| 欧美/亚洲一区| 亚洲欧洲日本一区二区三区| 蜜臀久久久99精品久久久久久| 久热精品视频在线观看| 亚洲高清不卡在线| 欧美国产精品一区| 日韩亚洲在线| 欧美亚洲视频在线观看| 国产一区二区三区在线观看精品 | 久久精品官网| 蜜桃久久av一区| 亚洲人人精品| 欧美日韩一区二区三区在线看| 日韩一级视频免费观看在线| 亚洲欧美日韩一区二区| 国产精品一区二区久久久| 亚洲欧美在线看| 蜜桃精品一区二区三区 | 国产精品视频xxx| 久久精品国产视频| 亚洲激情综合| 午夜精品国产精品大乳美女| 国内一区二区三区| 免费在线亚洲欧美| 艳妇臀荡乳欲伦亚洲一区| 欧美一区二区三区日韩| 亚洲第一级黄色片| 欧美午夜不卡| 欧美激情欧美激情在线五月| 亚洲精品国产精品国自产观看浪潮 | 亚洲国产欧美在线| 亚洲午夜在线| 国内精品国产成人| 欧美国产精品v| 亚洲欧美一区在线| 欧美国产视频在线观看| 亚洲欧美制服中文字幕| 亚洲黄色毛片| 国产欧美精品日韩区二区麻豆天美 | 欧美黄污视频| 麻豆成人精品| 亚洲午夜日本在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美日韩精品在线| 久久这里有精品视频| 亚洲视频在线看| 亚洲第一在线综合在线| 欧美亚洲日本一区| 亚洲视频www| 91久久精品视频| 狠狠色综合一区二区| 国产精品一区免费观看| 欧美精品亚洲精品| 免费看亚洲片| 久久综合亚州| 久久国产综合精品| 午夜激情综合网| 亚洲综合999|