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

Hello World!

程序員那點事兒

首頁 新隨筆 聯(lián)系 聚合 管理
  20 Posts :: 6 Stories :: 0 Comments :: 0 Trackbacks
概述
  它被描述成一個與自動化相兼容的類型,由于操作系統(tǒng)提供相應(yīng)的API函數(shù)(如SysAllocString)來管理它以及一些默認的調(diào)度代碼。因此BSTR實際上就是一個COM字符串,但它卻在自動化技術(shù)以外的多種場合下得到廣泛使用。

為什么需要BSTR

  COM是一種跨編程語言的平臺,需要提供語言無關(guān)的數(shù)據(jù)類型。多數(shù)編程語言有自己的字符串表示。
  ●C++ 字符串是以0結(jié)束的ASCII或Unicode字符數(shù)組。
  ●Visual Basic字符串是一個ASCII字符數(shù)組加上表示長度的前綴。
  ●Java字符串是以0結(jié)束的Unicode字符數(shù)組。
  需要定義一種通用的字符串類型,可以很容易的匹配到不同編程語言。C++中,就是BSTR

什么是BSTR

  BSTR是“Basic STRing”的簡稱,微軟在COM/OLE中定義的標(biāo)準(zhǔn)字符串?dāng)?shù)據(jù)類型。
  對于C++,Windows頭文件wtypes.h中定義如下:
  typedef wchar_t WCHAR;
  typedef WCHAR OLECHAR;
  typedef OLECHAR __RPC_FAR *BSTR;;
  使用以Null結(jié)尾的簡單字符串在COM component間傳遞不太方便。因此,標(biāo)準(zhǔn)BSTR是一個有長度前綴和null結(jié)束符的OLECHAR數(shù)組。BSTR的前4字節(jié)是一個表示字符串長度的前綴。BSTR長度域的值是字符串的字節(jié)數(shù),并且不包括0結(jié)束符。
  由于是Unicode串,所以字符數(shù)是字節(jié)數(shù)的一半。這種方式的優(yōu)點是允許程序員在BSTR串中間嵌入NULL字符。但是,BSTR的前四個字節(jié)表示長度,而OLECHAR數(shù)組的前四字節(jié)表示前兩個字符。這種情況下,對于C++程序,如何實現(xiàn)BSTR和OLECHAR的交換?答案是COM提供了兩個BSTR分配用的API:SysAllocString / SysReallocString。函數(shù)返回的指針指向BSTR的第一個字符,而不是BSTR在內(nèi)存的第一個字節(jié)。

什么時候使用BSTR

  只有在你不得不用的時候。
  使用BSTR一般有以下幾種情況:
  ●COM interface接口定義,并且不希望額外提供custom marshaling庫(MDIL生成或開發(fā)人員自己訂制),必須使用BSTR傳遞字符串。使用C/C++類型的字符串在COM DLL傳遞字符串,表面上可以使用,但違背了COM的基本規(guī)則,并且給以后的擴展留下了隱患。例如,把一個In-process COM Object(簡單說COM DLL)改成out-of-process object(COM EXE)。理論上,客戶端的代碼應(yīng)該不做任何改變。但如果是用了C/C++字符串,又希望只使用系統(tǒng)的automation mashaller(Oleaut32.dll),就會出錯。
  ●如果可以提供custom marshaling,也推薦使用BSTR。
  ●客戶要求接口必須使用BSTR,和客戶討論后,不能修改。
  ●使用的外部庫的接口使用BSTR
  不使用的情況:
  ●不推薦在IDL結(jié)構(gòu)體中定義BSTR成員,會給結(jié)構(gòu)體的復(fù)制和釋放帶來麻煩。最好直接使用限定最大長度的TCHAR數(shù)組。如果確實需要傳遞變長字符串,BSTR應(yīng)該被定義成獨立的參數(shù)或者使用獨立的get/set接口。
  ●盡可能縮小的BSTR及相關(guān)類型的作用域范圍。類的成員變量和函數(shù)參數(shù)不使用BSTR。局部變量要盡快釋放類的內(nèi)部不使用BSTR。代碼處理邏輯中只在接口直接相關(guān)部分使用BSTR。接收到一個BSTR時,盡量立刻變成C/C++的字符串副本進行處理。在需要傳遞BSTR參數(shù)前產(chǎn)生BSTR,用過立即釋放。

BSTR、char*和CString轉(zhuǎn)換 
  (1) char*轉(zhuǎn)換成CString

  若將char*轉(zhuǎn)換成CString,除了直接賦值外,還可使用CString::Format進行。例如:

char chArray[] = "This is a test"; 
char * p = "This is a test"; 

  或

LPSTR p = "This is a test"; 

  或在已定義Unicode應(yīng)的用程序中

TCHAR * p = _T("This is a test"); 

  或

LPTSTR p = _T("This is a test"); 
CString theString = chArray; 
theString.Format(_T("%s"), chArray); 
theString = p; 

  (2) CString轉(zhuǎn)換成char*

  若將CString類轉(zhuǎn)換成char*(LPSTR)類型,常常使用下列三種方法:

  方法一,使用強制轉(zhuǎn)換。例如:

CString theString( "This is a test" ); 
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;  

  方法二,使用strcpy。例如:

CString theString( "This is a test" ); 
LPTSTR lpsz = new TCHAR[theString.GetLength()+1]; 
_tcscpy(lpsz, theString); 

  需要說明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二個參數(shù)是 const wchar_t* (Unicode)或const char* (ANSI),系統(tǒng)編譯器將會自動對其進行轉(zhuǎn)換。

  方法三,使用CString::GetBuffer。例如:

CString s(_T("This is a test ")); 
LPTSTR p = s.GetBuffer(); 
// 在這里添加使用p的代碼 
if(p != NULL) *p = _T('\0'); 
s.ReleaseBuffer(); 
// 使用完后及時釋放,以便能使用其它的CString成員函數(shù) 

  (3) BSTR轉(zhuǎn)換成char*

  方法一,使用ConvertBSTRToString。例如:

#include 
#pragma comment(lib, "comsupp.lib") 
int _tmain(int argc, _TCHAR* argv[]){ 
BSTR bstrText = ::SysAllocString(L"Test"); 
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText); 
SysFreeString(bstrText); // 用完釋放 
delete[] lpszText2; 
return 0; 
}  

  方法二,使用_bstr_t的賦值運算符重載。例如:

_bstr_t b = bstrText; 
char* lpszText2 = b; 

  (4) char*轉(zhuǎn)換成BSTR

  方法一,使用SysAllocString等API函數(shù)。例如:

BSTR bstrText = ::SysAllocString(L"Test"); 
BSTR bstrText = ::SysAllocStringLen(L"Test",4); 
BSTR bstrText = ::SysAllocStringByteLen("Test",4); 

  方法二,使用COleVariant或_variant_t。例如:

//COleVariant strVar("This is a test"); 
_variant_t strVar("This is a test"); 
BSTR bstrText = strVar.bstrVal; 

  方法三,使用_bstr_t,這是一種最簡單的方法。例如:

BSTR bstrText = _bstr_t("This is a test"); 

  方法四,使用CComBSTR。例如:

BSTR bstrText = CComBSTR("This is a test"); 

  或

CComBSTR bstr("This is a test"); 
BSTR bstrText = bstr.m_str; 

  方法五,使用ConvertStringToBSTR。例如:

char* lpszText = "Test"; 
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText); 

  (5) CString轉(zhuǎn)換成BSTR

  通常是通過使用CStringT::AllocSysString來實現(xiàn)。例如:

CString str("This is a test"); 
BSTR bstrText = str.AllocSysString(); 
… 
SysFreeString(bstrText); // 用完釋放  

  (6) BSTR轉(zhuǎn)換成CString

  一般可按下列方法進行:

BSTR bstrText = ::SysAllocString(L"Test"); 
CStringA str; 
str.Empty(); 
str = bstrText;  

  或

CStringA str(bstrText); 

  (7) ANSI、Unicode和寬字符之間的轉(zhuǎn)換

  方法一,使用MultiByteToWideChar將ANSI字符轉(zhuǎn)換成Unicode字符,使用WideCharToMultiByte將Unicode字符轉(zhuǎn)換成ANSI字符。

  方法二,使用“_T”將ANSI轉(zhuǎn)換成“一般”類型字符串,使用“L”將ANSI轉(zhuǎn)換成Unicode,而在托管C++環(huán)境中還可使用S將ANSI字符串轉(zhuǎn)換成String*對象。例如:

TCHAR tstr[] = _T("this is a test"); 
wchar_t wszStr[] = L"This is a test"; 
String* str = S”This is a test”; 

  方法三,使用ATL 7.0的轉(zhuǎn)換宏和類。ATL7.0在原有3.0基礎(chǔ)上完善和增加了許多字符串轉(zhuǎn)換宏以及提供相應(yīng)的類,它具有如圖3所示的統(tǒng)一形式:

  其中,第一個C表示“類”,以便于ATL 3.0宏相區(qū)別,第二個C表示常量,2表示“to”,EX表示要開辟一定大小的緩沖。SourceType和DestinationType可以是A、T、W和OLE,其含義分別是ANSI、Unicode、“一般”類型和OLE字符串。例如,CA2CT就是將ANSI轉(zhuǎn)換成一般類型的字符串常量。下面是一些示例代碼:

LPTSTR tstr= CA2TEX<16>("this is a test"); 
LPCTSTR tcstr= CA2CT("this is a test"); 
wchar_t wszStr[] = L"This is a test"; 
char* chstr = CW2A(wszStr);  

  六、結(jié)語

  幾乎所有的程序都要用到字符串,而Visual C++.NET由于功能強大、應(yīng)用廣泛,因而字符串之間的轉(zhuǎn)換更為頻繁。本文幾乎涉及到目前的所有轉(zhuǎn)換方法。當(dāng)然對于.NET框架來說,還可使用Convert和Text類進行不同數(shù)據(jù)類型以及字符編碼之間的相互轉(zhuǎn)換。
 
posted on 2012-03-28 10:52 hello wold! 閱讀(19845) 評論(0)  編輯 收藏 引用 所屬分類: 技術(shù)相關(guān)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美电影电视剧在线观看| 黄色在线成人| 欧美一级久久久| 亚洲欧美日韩一区在线| 亚洲一线二线三线久久久| 亚洲色图综合久久| 亚洲综合日韩中文字幕v在线| 亚洲一本大道在线| 午夜精品成人在线| 久久深夜福利| 欧美日韩精品一区视频| 国产精品久久久久影院亚瑟| 国产精品日韩专区| 在线日韩中文字幕| 在线亚洲一区| 久久精品国产精品亚洲精品| 欧美电影免费观看高清完整版| 亚洲激情网址| 亚洲精品久久久久| 性色av一区二区三区| 裸体丰满少妇做受久久99精品| 欧美精品二区| 黑人巨大精品欧美一区二区小视频 | 欧美第一黄网免费网站| 欧美日韩国产小视频在线观看| 最新国产成人在线观看| 亚洲精品之草原avav久久| 亚洲尤物精选| 欧美精品一区二区三区蜜桃| 国产精品亚发布| 亚洲日本乱码在线观看| 午夜精品一区二区在线观看 | 久久亚洲国产成人| 亚洲日本欧美在线| 久久精品91| 国产精品豆花视频| 亚洲国产欧美精品| 久久精品人人做人人爽电影蜜月| 91久久精品网| 久久躁日日躁aaaaxxxx| 国产免费成人在线视频| 一区二区三区视频观看| 欧美成人在线免费视频| 先锋影音久久久| 国产精品久久久久影院色老大| 亚洲精品麻豆| 欧美freesex8一10精品| 欧美在线视频免费观看| 国产精品a级| av成人毛片| 亚洲激情社区| 欧美人与性禽动交情品| 亚洲人午夜精品免费| 欧美国产亚洲另类动漫| 久久久久国产精品一区三寸| 国产有码一区二区| 久久精品国产视频| 午夜精品久久| 国产一区二区三区不卡在线观看| 午夜精品区一区二区三| 亚洲桃色在线一区| 国产精品美女在线| 亚洲欧美偷拍卡通变态| 一本大道久久a久久精二百| 欧美大香线蕉线伊人久久国产精品| 亚洲激情视频网| 亚洲高清在线播放| 欧美精品在线看| 亚洲午夜日本在线观看| 中文在线一区| 国产自产精品| 欧美电影专区| 欧美人与性动交a欧美精品| 亚洲一区二区三区四区视频| 亚洲天堂激情| 狠狠综合久久av一区二区小说| 蜜月aⅴ免费一区二区三区| 六月天综合网| 国产精品99久久久久久有的能看| 一区二区欧美在线| 国产午夜亚洲精品不卡| 蜜臀av一级做a爰片久久| 欧美激情久久久久| 午夜精品在线观看| 日韩一级黄色av| 久久久久综合网| 亚洲电影欧美电影有声小说| 欧美国产精品劲爆| 欧美日韩国产成人在线| 亚洲自拍偷拍视频| 欧美在线观看视频一区二区三区| 亚洲国产精品t66y| 99亚洲伊人久久精品影院红桃| 国产精品美腿一区在线看| 久久精品亚洲一区二区| 久久免费偷拍视频| 在线亚洲高清视频| 久久久久久久综合狠狠综合| 这里只有精品电影| 久久精品日产第一区二区三区| 亚洲免费观看高清在线观看| 亚洲女与黑人做爰| 亚洲日韩欧美视频一区| 午夜老司机精品| 99视频国产精品免费观看| 欧美一区二区精品久久911| 日韩午夜免费| 久久久噜久噜久久综合| 小黄鸭视频精品导航| 欧美激情区在线播放| 久久99伊人| 欧美日韩国语| 欧美高清你懂得| 国产亚洲精品一区二区| 一本大道久久a久久精品综合| 亚洲国产精彩中文乱码av在线播放| 亚洲视频一区二区| 日韩亚洲欧美高清| 久久一区二区三区av| 性色av一区二区三区红粉影视| 欧美激情一区二区三级高清视频| 久久久精彩视频| 国产精品mm| 亚洲乱码国产乱码精品精可以看 | 亚洲夫妻自拍| 欧美影院视频| 欧美一区二区三区免费观看| 欧美精品一区二区三区蜜桃| 欧美成人综合在线| 在线看片一区| 久久久视频精品| 久久香蕉国产线看观看av| 国产伦精品一区二区三区免费迷 | 久久福利资源站| 欧美在线free| 国产日韩精品视频一区二区三区| 这里是久久伊人| 亚洲欧美成人一区二区三区| 欧美日韩一区二区国产| 亚洲精品乱码久久久久久黑人 | 欧美一级片久久久久久久| 欧美精品www在线观看| 亚洲国产精品成人综合色在线婷婷 | 一区二区欧美国产| 欧美激情国产日韩| 亚洲精品欧美日韩专区| 亚洲精品日韩综合观看成人91 | 国内久久婷婷综合| 久久动漫亚洲| 免费在线成人av| 亚洲高清视频一区| 免费在线国产精品| 亚洲黄色性网站| 一区二区日韩精品| 国产精品豆花视频| 久久av免费一区| 免费成人小视频| 亚洲日本成人网| 欧美日韩午夜| 午夜在线视频一区二区区别 | 亚洲欧美日韩在线不卡| 欧美在线观看一区| 一区久久精品| 欧美日韩精品欧美日韩精品一| 亚洲视频香蕉人妖| 久热re这里精品视频在线6| 最新亚洲电影| 欧美日韩综合不卡| 欧美一区二区三区视频免费| 欧美国产三区| 欧美在线亚洲| 99国产一区二区三精品乱码| 国产精品一区二区久久| 裸体一区二区| 午夜精品国产更新| 亚洲国产一区二区三区a毛片| 欧美一进一出视频| 欧美一区二区三区在| 欧美高清在线视频观看不卡| 制服丝袜激情欧洲亚洲| 国产日韩一区在线| 麻豆91精品91久久久的内涵| 中文欧美日韩| 欧美黄色一区| 欧美一区二区三区四区在线| 亚洲国产精品久久久久婷婷老年 | 国产午夜精品理论片a级大结局 | 日韩亚洲精品在线| 久久久综合精品| 亚洲综合三区| 亚洲精品中文字幕女同| 国产亚洲欧美一区| 欧美午夜国产| 欧美巨乳波霸| 欧美不卡视频一区| 久久久久久久999精品视频| 一区二区三区四区精品| 亚洲黄色三级| 亚洲电影在线免费观看| 久久久99精品免费观看不卡|