• <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>
            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來判斷的。在VC6.0中:

            #include <WINNT.h>只在WINDEF.H中出現(xiàn)過。
            #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庫的很多字符串處理函數(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í)都是寬字符串),只不過在使用BSTR時(shí),得用到特殊的申請/釋放函數(shù)組。因?yàn)锽STR指針位置前面有一個(gè)四字節(jié)的數(shù)據(jù),存儲(chǔ)的是BSTR的長度。就是這個(gè)原因,我們不能把OLECHAR*當(dāng)作BSTR來用,而編譯器在遇到這種方式時(shí)還不報(bào)錯(cuò)!

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

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

            三、CComBSTR

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

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

            四、_bstr_t

            _bstr_t是一個(gè)與ATL無關(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)換,可以說這是個(gè)底層函數(shù)。程序員對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中的方法搬了過來;而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 以來 ATL 7.0 和 MFC 7.0 中的重大更改》中有提到:從 BSTR 轉(zhuǎn)換到 CString

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

            BSTR bstr = SysAllocString(L"Hello");
            CString str = bstr;
            SysFreeString(bstr);對于 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)開銷,采用反向類型(如帶 UNICODE 參數(shù)的 CStringA,或者帶 ANSI 參數(shù)的 CStringW)的構(gòu)造函數(shù)現(xiàn)在在 stdafx.h 中被使用下面的項(xiàng)標(biāo)記為顯式的:

            #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS

            若要避免此錯(cuò)誤,請執(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及以前,很多程序員都做過將MFC中的CString,這種在網(wǎng)上很多。我看到的一個(gè)很完整的是gosh的gd::CString,網(wǎng)址是
            http://www.codeproject.com/soap/serialize_xml.asp 。據(jù)這位老兄自己說,他自己還沒有VC 6.0編譯器。

            六、std::string和std::wstring

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

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

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

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

            在M$的《自Visual C++6.0以來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 代碼頁執(zhí)行的。從 Visual C++ .NET 中的 ATL 7.0 開始,字符串轉(zhuǎn)換將使用當(dāng)前線程的默認(rèn) ANSI 代碼頁執(zhí)行,除非定義了 _CONVERSION_DONT_USE_THREAD_LOCALE(此情況下,如以前一樣使用系統(tǒng)的 ANSI 代碼頁)。

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

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

            COM程序中,接口一般都是BSTR,所以無論在編寫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) 閱讀(2017) 評論(0)  編輯 收藏 引用

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


            <2008年10月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            收藏夾

            C++

            MyFavorite

            搜索

            •  

            積分與排名

            • 積分 - 327094
            • 排名 - 75

            最新評論

            閱讀排行榜

            評論排行榜

            AV无码久久久久不卡蜜桃 | 色偷偷88888欧美精品久久久| 亚洲Av无码国产情品久久| 精品久久久久久国产潘金莲| 偷偷做久久久久网站| 久久久青草久久久青草| 久久精品国产精品亚洲毛片| 久久婷婷国产剧情内射白浆| 久久久久亚洲精品无码蜜桃| 国产精品免费久久| 中文无码久久精品| 欧美久久亚洲精品| 久久国产综合精品五月天| 一级女性全黄久久生活片免费 | 色欲综合久久躁天天躁蜜桃| 日产精品久久久久久久| 97久久精品人人做人人爽| 无码任你躁久久久久久老妇| 精品久久久久久亚洲精品| 中文字幕精品久久| 久久av高潮av无码av喷吹| 久久久久久久人妻无码中文字幕爆 | 精品一区二区久久| 亚洲中文精品久久久久久不卡| 亚洲国产成人久久精品动漫| 一本色道久久综合狠狠躁| 久久99国产精品久久99小说| 国产精品内射久久久久欢欢| 99久久免费国产特黄| 日本五月天婷久久网站| 欧美久久一区二区三区| 久久久99精品成人片中文字幕| 婷婷综合久久狠狠色99h| 久久久久99精品成人片欧美| 亚洲精品无码久久一线| 国产成人精品综合久久久久| 国产香蕉久久精品综合网| 久久综合给合综合久久| 婷婷久久五月天| 色综合久久久久久久久五月| 久久婷婷五月综合国产尤物app|