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

<2011年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

統(tǒng)計(jì)

  • 隨筆 - 24
  • 文章 - 0
  • 評(píng)論 - 17
  • 引用 - 0

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

相冊(cè)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

BSTR CComBSTR及ATL字符串轉(zhuǎn)換宏
一 BSTR及CComBSTR

MSDN文檔中說(shuō),BSTR是四字節(jié)長(zhǎng)度前綴的,NULL結(jié)尾的寬字符串,稱之為VB字符串或BINARY字符串。
依次查找?guī)讉€(gè)頭文件,不難發(fā)現(xiàn),BSTR被typedef成OLECHAR *,而OLECHAR被typedef成WCHAR(未定義OLE2ANSI預(yù)處理宏)或char (定義OLE2ANSI預(yù)處理宏);繼續(xù)順藤摸瓜,WCHAR被typedef成wchar_t,而wchar_t被typedef成unsigned short。

最終的結(jié)果就是,BSTR被typedef成unsigned short *(未定義OLE2ANSI預(yù)處理宏)或char *(定義OLE2ANSI預(yù)處理宏)。

原來(lái)BSTR只是一個(gè)指針。

本文不考慮定義預(yù)處理宏OLE2ANSI的情況。

在COM編程中,凡是使用BSTR的地方,我們可以使用類CComBSTR來(lái)代替BSTR。CComBSTR封裝了BSTR,通過(guò)各種重載構(gòu)造函數(shù)和操作符重載,僅僅使用對(duì)象定義,type cast等簡(jiǎn)單語(yǔ)句,就可以實(shí)現(xiàn)BSTR與各種類型字符串,包括LPSTR,LPOLESTR之間的轉(zhuǎn)換,賦值,連接,比較等操作。

二 ATL字符串轉(zhuǎn)換宏
除了CComBSTR類支持各種字符串類型到BSTR的轉(zhuǎn)換以外,ATL還有一組字符串轉(zhuǎn)換宏,可以方便的進(jìn)行各種類型字符串之間的轉(zhuǎn)換。這些宏有統(tǒng)一的形式:X2[C]Y或Z2BSTR。其中X,Y,Z可以為A,W,T,OLE中的任一種,X與Y不相同;C表示轉(zhuǎn)換的目標(biāo)類型為const——因此,這樣的組合方式總共有4x3x2+4=28種。

根據(jù)預(yù)處理宏_UNICODE定義與否,T被替代成W或A,所以這28個(gè)轉(zhuǎn)換宏最終可以歸結(jié)為兩類:一類是A和W之間的轉(zhuǎn)換,另一類是A,W到BSTR的轉(zhuǎn)換。

下面看看第一類中A2W的實(shí)現(xiàn)。
// Exerpt from ATLCONV.H   
#define A2W(lpa) (\
        ((_lpa 
= lpa) == NULL) ? NULL : (\
            _convert 
= (lstrlenA(_lpa)+1),\
            ATLA2WHELPER((LPWSTR) alloca(_convert
*2), _lpa, _convert)))

A2W是支持從ANSI字符串到UNICODE字符串的轉(zhuǎn)換宏。可以看到,A2W的主體是一個(gè)?:表達(dá)式,根據(jù)源字符串是否為NULL,對(duì)冒號(hào)之前或之后的表達(dá)式進(jìn)行求值。冒號(hào)后的部分又是一個(gè)逗號(hào)表達(dá)式:先計(jì)算源字符串的長(zhǎng)度,再調(diào)用被定義為同名宏(大小寫(xiě)不同)的轉(zhuǎn)換函數(shù),轉(zhuǎn)換函數(shù)中調(diào)用MultiByteToWideChar系統(tǒng)函數(shù)進(jìn)行具體的轉(zhuǎn)換,逗號(hào)表達(dá)式的值是轉(zhuǎn)換函數(shù)的返回值。最終,轉(zhuǎn)換宏的值是NULL或者轉(zhuǎn)換函數(shù)的返回值。

值得注意的是,在A2W宏定義中引用了類似_lpa, _convert等標(biāo)識(shí)符,那么這些標(biāo)識(shí)符是什么,又是哪里來(lái)的呢?
這就是為什么在使用這些字符串轉(zhuǎn)換宏之前,需要統(tǒng)一加上一句
USES_CONVERSION;
USES_CONVERSION也是宏定義,就是用來(lái)聲明轉(zhuǎn)換宏中使用的標(biāo)識(shí)符的。

另外,MSDN中特別提到,A和W之間的轉(zhuǎn)換(A2W,W2A),以及通過(guò)預(yù)處理宏_UNICODE翻譯成A和W之間轉(zhuǎn)換的宏,它們無(wú)一例外的都是從調(diào)用函數(shù)棧上分配空間存放轉(zhuǎn)換結(jié)果字符串。因此,轉(zhuǎn)換結(jié)果字符串在調(diào)用函數(shù)返回后自動(dòng)被清除,也就是不能保留轉(zhuǎn)換結(jié)果用于調(diào)用函數(shù)外使用。

與之相對(duì),再看看第二類,A,W,T,OLE到BSTR的轉(zhuǎn)換宏實(shí)現(xiàn)。
// Exerpt from ATLCONV.H
inline BSTR OLE2BSTR(LPCOLESTR lp) {return ::SysAllocString(lp);}
#if defined(_UNICODE)
// in these cases the default (TCHAR) is the same as OLECHAR
    inline BSTR T2BSTR(LPCTSTR lp) {return ::SysAllocString(lp);}
    inline BSTR A2BSTR(LPCSTR lp) {USES_CONVERSION; 
return A2WBSTR(lp);}
    inline BSTR W2BSTR(LPCWSTR lp) {
return ::SysAllocString(lp);}
#elif defined(OLE2ANSI)
// in these cases the default (TCHAR) is the same as OLECHAR
    inline BSTR T2BSTR(LPCTSTR lp) {return ::SysAllocString(lp);}
    inline BSTR A2BSTR(LPCSTR lp) {
return ::SysAllocString(lp);}
    inline BSTR W2BSTR(LPCWSTR lp) {USES_CONVERSION; 
return ::SysAllocString(W2COLE(lp));}
#else
    inline BSTR T2BSTR(LPCTSTR lp) {USES_CONVERSION; 
return A2WBSTR(lp);}
    inline BSTR A2BSTR(LPCSTR lp) {USES_CONVERSION; 
return A2WBSTR(lp);}
    inline BSTR W2BSTR(LPCWSTR lp) {
return ::SysAllocString(lp);}
#endif

同樣,除了OLE2BSTR以外,A,W,T到BSTR的轉(zhuǎn)換根據(jù)是否定義預(yù)處理宏_UNICODE進(jìn)行不同的處理,最終歸結(jié)為兩種類型的轉(zhuǎn)換:A2BSTR和W2BSTR。對(duì)于A2BSTR,由于BSTR也就是W,所以A2BSTR的轉(zhuǎn)換在理論上同A2W應(yīng)該相同。

但實(shí)際上,A2BSTR調(diào)用函數(shù)A2WBSTR,A2WBSTR內(nèi)部從堆上分配空間,再調(diào)用系統(tǒng)轉(zhuǎn)換函數(shù)MultiByteToWideChar進(jìn)行轉(zhuǎn)換——這就是A,W之間的轉(zhuǎn)換與2BSTR類型的轉(zhuǎn)換的根本不同之處;W2BSTR就簡(jiǎn)單了,由于BSTR即是W字符串,因此不需要實(shí)際轉(zhuǎn)換,只需分配空間并拷貝源串作為轉(zhuǎn)換結(jié)果即可。

對(duì)于OLE2BSTR,由于BSTR是從OLECHAR定義來(lái)的(見(jiàn)上面BSTR類型定義),因此不管預(yù)處理宏如何定義(包括OLE2ANSI是否定義),二者的類型始終是一致的,因此,從OLE到BSTR,并不需要進(jìn)行實(shí)際的轉(zhuǎn)換,只需分配空間并拷貝源串作為轉(zhuǎn)換結(jié)果即可。

總結(jié)下來(lái),28個(gè)字符串轉(zhuǎn)換宏中,根據(jù)結(jié)果字符串存放位置分為兩類,一類是A,W之間的轉(zhuǎn)換宏,這一類宏的轉(zhuǎn)換結(jié)果字符串放在調(diào)用函數(shù)的棧空間,調(diào)用函數(shù)返回會(huì)該空間自動(dòng)清除,第二類為目的類型為BSTR的轉(zhuǎn)換宏,其轉(zhuǎn)換結(jié)果字符串放在系統(tǒng)堆,在調(diào)用函數(shù)返回后結(jié)果字符串仍然存在。這是兩類轉(zhuǎn)換宏之間的最顯著差別。

測(cè)試代碼
// TestATLX2Y.cpp

#include 
<iostream>
#include 
<atlbase.h>
using namespace std;

#ifdef _UNICODE
#define TCOUT wcout
#else
#define TCOUT cout
#endif

int main()
{
#ifdef _UNICODE
    TCOUT 
<< _T("----- Test with _UNICODE --------"<< endl;
#else
    TCOUT 
<< _T("----- Test without _UNICODE --------"<< endl;
#endif

    LPTSTR lptstr
=_T("TCHAR is either char or wchar_t");
    LPSTR lpstr
="How can I indicate i'm a LPSTR?";
    LPWSTR lpwstr
=L"I am a wide-character string";
    TCOUT 
<< _T("lptstr:"<< lptstr << endl;
    cout 
<< "lpstr:" << lpstr << endl;
    wcout 
<< L"lpwstr:" << lpwstr << endl;
    
    USES_CONVERSION;
    TCOUT 
<< _T("A2T:"<< A2T(lpstr) << endl;
    wcout 
<< L"A2W:" << A2W(lpstr) << endl;
    cout 
<< "T2A:" << T2A(lptstr) << endl;
    wcout 
<< L"T2W:" << T2W(lptstr) << endl;
    cout 
<< "W2A:" << W2A(lpwstr) << endl;
    TCOUT 
<< _T("W2T:"<< W2T(lpwstr) << endl;
    BSTR bstr;
    wcout 
<< L"A2BSTR:" << (bstr=A2BSTR(lpstr)) << endl;
    ::SysFreeString(bstr);
    wcout 
<< L"W2BSTR:" << (bstr=W2BSTR(lpwstr)) << endl;
    
    wcout 
<< L"T2BSTR:" << (bstr=T2BSTR(lptstr)) << endl;
    
// How to know if we need to free the space pointered by returned value of T2BSTR?
    if((void *)bstr!=(void *)lptstr) ::SysFreeString(bstr);
    
    wcout 
<< L"OLE2BSTR:" << OLE2BSTR(lpwstr) << endl;
    
return 0;
}


代碼運(yùn)行結(jié)果:

posted on 2011-12-03 22:56 小蔥蘸醬 閱讀(5315) 評(píng)論(0)  編輯 收藏 引用 所屬分類: COM

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲三级免费观看| 亚洲一区成人| 国产乱肥老妇国产一区二| 久久精品观看| 久久久免费精品| 欧美风情在线观看| 久久久久久亚洲精品不卡4k岛国| 久久成人免费电影| 欧美va天堂在线| 欧美体内谢she精2性欧美| 国产精品高潮呻吟久久| 国产精品蜜臀在线观看| 国产亚洲一区二区在线观看| 亚洲国产精品成人精品| 日韩一区二区电影网| 午夜精品视频在线观看一区二区 | 99精品视频免费观看视频| 亚洲国产一区视频| 亚洲无吗在线| 欧美日韩国产色视频| 亚洲第一精品夜夜躁人人爽| 亚洲一区二区免费在线| 欧美激情一区二区三区蜜桃视频 | 午夜精品国产更新| 欧美第十八页| 亚洲成人资源网| 玖玖国产精品视频| 亚洲欧美激情一区二区| 欧美精品日韩精品| 亚洲精品乱码久久久久久日本蜜臀 | 欧美日韩大片| 日韩午夜三级在线| 亚洲韩国精品一区| 欧美日韩午夜激情| 日韩视频在线一区二区三区| 欧美不卡视频一区| 暖暖成人免费视频| 一区二区三区免费网站| 亚洲精品美女免费| 欧美日韩国产高清视频| 亚洲一区视频| 亚洲手机视频| 国产亚洲一二三区| 久久久久久久波多野高潮日日| 亚洲天堂久久| 永久免费精品影视网站| 亚洲人成在线播放| 欧美日韩国内自拍| 久久狠狠婷婷| 欧美激情视频给我| 欧美一级黄色网| 另类专区欧美制服同性| 欧美成年人视频网站| 一区二区三区四区国产精品| 亚洲天堂网站在线观看视频| 亚洲国产91精品在线观看| 亚洲日韩第九十九页| 国产香蕉97碰碰久久人人| 欧美福利电影网| 韩国欧美国产1区| 亚洲一区二区在线观看视频| 99热这里只有精品8| 久久精品电影| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩亚洲视频一区| 亚洲国产婷婷| 亚洲日本欧美日韩高观看| 久久久蜜桃一区二区人| 久久久久九九九| 狠狠色综合一区二区| 欧美一级黄色录像| 欧美一区二区三区在线观看视频| 国产精品久久久久久久久久免费| 男女精品网站| 亚洲裸体视频| 欧美日韩另类丝袜其他| 国产欧美精品日韩精品| 欧美一级久久久久久久大片| 欧美在线观看视频在线| 国产一区三区三区| 女主播福利一区| 99re8这里有精品热视频免费| 亚洲视频一区二区在线观看| 国产精品久久久久久亚洲毛片| 亚洲一区二区三区777| 久久久天天操| 亚洲国产精品悠悠久久琪琪| 激情视频一区二区| 午夜精品久久久久久久久久久| 中文无字幕一区二区三区| 欧美日韩精品欧美日韩精品 | 欧美一区二区视频在线| 日韩视频在线一区| 国产一区91精品张津瑜| 美女亚洲精品| 亚洲欧美成人精品| 欧美福利一区| 亚洲美女免费视频| 欧美影院视频| 午夜日韩激情| 久久aⅴ乱码一区二区三区| 亚洲欧美成人网| 亚洲视频在线观看三级| 一区二区三区四区蜜桃| 国产一区二区日韩精品| 欧美视频官网| 欧美日韩国产区一| 国产精品国产一区二区| 欧美激情一级片一区二区| 久久婷婷亚洲| 久久在精品线影院精品国产| 鲁大师成人一区二区三区| 欧美好吊妞视频| 一区二区三区日韩| 久久激情五月丁香伊人| 蜜臀久久99精品久久久久久9| 亚洲精品老司机| 麻豆精品在线播放| 欧美理论在线| 韩国精品一区二区三区| 亚洲视频一二区| 欧美激情视频网站| 日韩视频三区| 久久久久国色av免费观看性色| 久久夜色精品国产欧美乱极品| 免费观看30秒视频久久| 国产日韩欧美精品在线| 国产欧美在线观看| 性亚洲最疯狂xxxx高清| 欧美午夜精品一区| 99国产精品久久久久久久| 欧美一区二区三区喷汁尤物| 欧美在线免费观看视频| 9国产精品视频| 欧美精品在线观看一区二区| 国产综合激情| 久久不射2019中文字幕| 亚洲免费观看高清在线观看| 久热这里只精品99re8久| 国产日韩欧美精品综合| 99精品99| 91久久精品国产| 欧美精品v国产精品v日韩精品| 国产精品久久久久毛片大屁完整版| 韩国一区二区三区美女美女秀| 亚洲欧美自拍偷拍| 欧美在线视频观看| 国产欧美一区二区三区在线老狼| 亚洲一区二区精品在线| 日韩一本二本av| 国产视频一区在线观看| 亚洲激情国产| 在线不卡a资源高清| 亚洲乱码国产乱码精品精天堂 | 亚洲制服丝袜在线| 欧美日韩综合网| 欧美一区2区三区4区公司二百| 亚洲在线视频一区| 国产精品久久久久久久久久尿| 亚洲一区二区毛片| 亚洲综合另类| 国产精品video| 一区二区三区久久网| 欧美阿v一级看视频| 久久综合电影| 亚洲精选久久| 亚洲欧美精品在线观看| 尤物精品在线| 亚洲一区二三| aa日韩免费精品视频一| 国产视频久久久久| 欧美国产日韩免费| 国产欧美日韩视频在线观看 | 美女国产一区| 欧美日韩在线另类| 久久青草欧美一区二区三区| 欧美激情综合亚洲一二区| 久久综合色播五月| 欧美日韩国产美女| 欧美freesex8一10精品| 国产精品入口| 亚洲综合第一| 新片速递亚洲合集欧美合集| 欧美国产视频在线观看| 久久亚洲综合| 影音先锋在线一区| 久久一区视频| 久久婷婷亚洲| 激情综合亚洲| 久久一二三区| 亚洲精选中文字幕| 99re热这里只有精品免费视频| 蜜臀91精品一区二区三区| 欧美电影免费网站| 日韩一级精品| 欧美午夜片在线观看| 亚洲视频1区| 麻豆91精品| 亚洲视频在线观看三级| 国产欧美大片|