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

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ù),存儲的是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$會把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) 閱讀(2024) 評論(0)  編輯 收藏 引用

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


<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

文章檔案

相冊

收藏夾

C++

MyFavorite

搜索

  •  

積分與排名

  • 積分 - 328995
  • 排名 - 75

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 亚洲免费视频一区二区| 欧美第十八页| 麻豆成人精品| 欧美日韩不卡| 欧美性久久久| 国产手机视频精品| 国产一级精品aaaaa看| 激情校园亚洲| 136国产福利精品导航网址| 亚洲第一在线| 亚洲天堂av在线免费| 午夜精品久久久| 蜜桃久久精品乱码一区二区| 亚洲二区视频| 亚洲精品乱码视频| 亚洲免费在线看| 久久免费视频这里只有精品| 欧美日韩精品久久久| 国产欧美视频一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲人成网站色ww在线| 亚洲影院污污.| 欧美成人午夜激情| 亚洲网站啪啪| 免费欧美在线视频| 国产一区二区久久| 一个人看的www久久| 久久久最新网址| 亚洲美女在线观看| 麻豆成人91精品二区三区| 国产精品欧美日韩久久| 亚洲精品一区二区三区四区高清| 亚洲欧美在线免费| 亚洲丶国产丶欧美一区二区三区 | 欧美jjzz| 国产日韩欧美中文| 亚洲一区bb| 欧美成人一区在线| 欧美亚洲日本网站| 欧美视频一区二区三区…| 亚洲电影毛片| 性欧美8khd高清极品| 91久久夜色精品国产九色| 国产欧美日韩综合精品二区| 欧美在线免费视屏| 狠狠色丁香婷婷综合影院| 久久久青草婷婷精品综合日韩| 亚洲综合色婷婷| 国内精品久久久久伊人av| 久久精品在线观看| 久久婷婷综合激情| 亚洲精品中文字| 宅男噜噜噜66一区二区| 国产美女在线精品免费观看| 久久久综合视频| 欧美片网站免费| 欧美一区二区网站| 美女脱光内衣内裤视频久久影院 | 国产日本精品| 欧美华人在线视频| 国产免费亚洲高清| 亚洲黄网站在线观看| 国产精品网站在线播放| 亚洲电影一级黄| 国内精品久久久久久久影视蜜臀| 亚洲精品久久久蜜桃| 激情综合视频| 欧美亚洲一区| 午夜精品美女自拍福到在线| 欧美激情一区二区三区在线视频| 久久久夜色精品亚洲| 国产精品美女xx| 亚洲美女区一区| 在线亚洲高清视频| 亚洲欧美色婷婷| 国产乱码精品一区二区三区不卡 | 亚洲午夜高清视频| 欧美日韩中文字幕精品| 亚洲高清av| 亚洲欧洲日产国产综合网| 久久精品一区二区三区不卡| 欧美一区二区三区免费观看| 欧美日韩视频在线一区二区| 亚洲夫妻自拍| 亚洲天堂av在线免费| 国产精品久在线观看| 亚洲欧美在线高清| 免费欧美视频| 一个色综合av| 国产午夜精品久久| 久久久777| 99国产麻豆精品| 欧美专区在线| 亚洲精品乱码久久久久| 欧美日韩国产色视频| 亚洲一区二区三区午夜| 免费视频一区二区三区在线观看| 欧美在线在线| 一本久久a久久精品亚洲| 久久久久女教师免费一区| 亚洲欧洲精品一区| 国内综合精品午夜久久资源| 欧美日韩在线看| 久久这里只有| 性欧美1819sex性高清| 亚洲高清不卡av| 久久另类ts人妖一区二区| 中国成人在线视频| 亚洲国产精品免费| 悠悠资源网亚洲青| 亚洲欧美日产图| 亚洲精品影院在线观看| 亚洲国产欧美一区| 欧美成人精品影院| 亚洲国产99| 亚洲国产精品久久久久婷婷884| 久久激情婷婷| 久久网站热最新地址| 嫩模写真一区二区三区三州| 久久久久九九视频| 久久九九国产精品| 久久一区欧美| 亚洲高清二区| 一区二区三区欧美激情| 亚洲欧美日韩国产精品| 久久国产精品99国产精| 欧美成年人视频网站| 欧美激情影院| 国产亚洲精品久久久久婷婷瑜伽| 国产欧美综合在线| 亚洲欧洲日韩综合二区| 亚洲欧美在线aaa| 欧美xx视频| 亚洲一区国产| 欧美高清视频在线| 国产日韩成人精品| 日韩午夜精品视频| 久久噜噜亚洲综合| 在线视频你懂得一区| 久久影视三级福利片| 欧美性一二三区| 亚洲区欧美区| 免费在线看成人av| 午夜精品影院| 国产精品日韩二区| 亚洲视频欧美视频| 欧美91大片| 久久国产婷婷国产香蕉| 欧美日韩一区二区视频在线观看| 一区二区视频免费在线观看| 亚洲自拍电影| 一本久道久久综合中文字幕| 一区二区三区免费看| 亚洲国产精品专区久久| 久久精品亚洲一区| 欧美资源在线观看| 国产亚洲福利| 久热精品在线| 美女视频一区免费观看| 亚洲精品一区二区三区在线观看 | 亚洲影院免费| 亚洲伦伦在线| 欧美色视频在线| 亚洲一区二区精品在线观看| 亚洲毛片av| 国产欧美日韩一区二区三区| 亚洲欧美日韩国产综合| 久久精品一区二区三区四区| 国产一区免费视频| 亚洲精品国久久99热| 欧美日韩八区| 欧美在线一区二区| 久久久免费av| 亚洲一区二区成人| 久久亚洲私人国产精品va媚药| 亚洲精品一区二区三区福利| 亚洲人成7777| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲国产精品一区制服丝袜| 国产精品区免费视频| 亚洲国产天堂网精品网站| 国产欧美一区视频| 日韩亚洲欧美一区| 国产午夜精品福利| 一本色道久久综合亚洲精品婷婷 | 国产精品久久久久三级| 裸体一区二区| 国产一区二区三区高清在线观看| 亚洲精品四区| 夜夜爽www精品| 美女精品网站| 亚洲成色www久久网站| 国产一区日韩一区| 亚洲国产一区二区视频 | 欧美一区视频在线| 亚洲综合日韩在线| 国产精品乱子久久久久| 亚洲一区日韩| 久久久久久成人|