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

隨筆 - 67  文章 - 171  trackbacks - 0
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(10)

隨筆分類

隨筆檔案

連接資料

最新隨筆

搜索

  •  

最新隨筆

最新評(píng)論

一、BSTR、LPSTR和LPWSTR
在Visual C++.NET的所有編程方式中,我們常常要用到這樣的一些基本字符串類型,如BSTR、LPSTR和LPWSTR等。之所以出現(xiàn)類似上述的這些數(shù)據(jù)類型,是因?yàn)椴煌幊陶Z言之間的數(shù)據(jù)交換以及對(duì)ANSI、Unicode和多字節(jié)字符集(MBCS)的支持。

  那么什么是BSTR、LPSTR以及LPWSTR呢?

  BSTR(Basic STRing,Basic字符串)是一個(gè)OLECHAR*類型的Unicode字符串。它被描述成一個(gè)與自動(dòng)化相兼容的類型。由于操作系統(tǒng)提供相應(yīng)的API函數(shù)(如SysAllocString)來管理它以及一些默認(rèn)的調(diào)度代碼,因此BSTR實(shí)際上就是一個(gè)COM字符串,但它卻在自動(dòng)化技術(shù)以外的多種場合下得到廣泛使用。圖1描述了BSTR的結(jié)構(gòu),其中DWORD值是字符串中實(shí)際所占用的字節(jié)數(shù),且它的值是字符串中Unicode字符的兩倍。

  LPSTR和LPWSTR是Win32和VC++所使用的一種字符串?dāng)?shù)據(jù)類型。LPSTR被定義成是一個(gè)指向以NULL(‘\0’)結(jié)尾的8位ANSI字符數(shù)組指針,而LPWSTR是一個(gè)指向以NULL結(jié)尾的16位雙字節(jié)字符數(shù)組指針。在VC++中,還有類似的字符串類型,如LPTSTR、LPCTSTR等,它們的含義如圖2所示。

  例如,LPCTSTR是指“long pointer to a constant generic string”,表示“一個(gè)指向一般字符串常量的長指針類型”,與C/C++的const char*相映射,而LPTSTR映射為 char*。

  一般地,還有下列類型定義:

#ifdef UNICODE
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif

二、CString、CStringA 和 CStringW

  Visual C++.NET中將CStringT作為ATL和MFC的共享的“一般”字符串類,它有CString、CStringA和CStringW三種形式,分別操作不同字符類型的字符串。這些字符類型是TCHAR、char和wchar_t。TCHAR在Unicode平臺(tái)中等同于WCHAR(16位Unicode字符),在ANSI中等價(jià)于char。wchar_t通常定義為unsigned short。由于CString在MFC應(yīng)用程序中經(jīng)常用到,這里不再重復(fù)。

三、VARIANT、COleVariant 和_variant_t

  在OLE、ActiveX和COM中,VARIANT數(shù)據(jù)類型提供了一種非常有效的機(jī)制,由于它既包含了數(shù)據(jù)本身,也包含了數(shù)據(jù)的類型,因而它可以實(shí)現(xiàn)各種不同的自動(dòng)化數(shù)據(jù)的傳輸。下面讓我們來看看OAIDL.H文件中VARIANT定義的一個(gè)簡化版:

struct tagVARIANT {
VARTYPE vt;
union {
short iVal; // VT_I2.
long lVal; // VT_I4.
float fltVal; // VT_R4.
double dblVal; // VT_R8.
DATE date; // VT_DATE.
BSTR bstrVal; // VT_BSTR.

short * piVal; // VT_BYREF|VT_I2.
long * plVal; // VT_BYREF|VT_I4.
float * pfltVal; // VT_BYREF|VT_R4.
double * pdblVal; // VT_BYREF|VT_R8.
DATE * pdate; // VT_BYREF|VT_DATE.
BSTR * pbstrVal; // VT_BYREF|VT_BSTR.
};
};

  顯然,VARIANT類型是一個(gè)C結(jié)構(gòu),它包含了一個(gè)類型成員vt、一些保留字節(jié)以及一個(gè)大的union類型。例如,如果vt為VT_I2,那么我們可以從iVal中讀出VARIANT的值。同樣,當(dāng)給一個(gè)VARIANT變量賦值時(shí),也要先指明其類型。例如:

VARIANT va;
:: VariantInit(&va); // 初始化
int a = 2002;
va.vt = VT_I4; // 指明long數(shù)據(jù)類型
va.lVal = a; // 賦值

  為了方便處理VARIANT類型的變量,Windows還提供了這樣一些非常有用的函數(shù):

  VariantInit —— 將變量初始化為VT_EMPTY;

  VariantClear —— 消除并初始化VARIANT;

  VariantChangeType —— 改變VARIANT的類型;

  VariantCopy —— 釋放與目標(biāo)VARIANT相連的內(nèi)存并復(fù)制源VARIANT。

  COleVariant類是對(duì)VARIANT結(jié)構(gòu)的封裝。它的構(gòu)造函數(shù)具有極為強(qiáng)大大的功能,當(dāng)對(duì)象構(gòu)造時(shí)首先調(diào)用VariantInit進(jìn)行初始化,然后根據(jù)參數(shù)中的標(biāo)準(zhǔn)類型調(diào)用相應(yīng)的構(gòu)造函數(shù),并使用VariantCopy進(jìn)行轉(zhuǎn)換賦值操作,當(dāng)VARIANT對(duì)象不在有效范圍時(shí),它的析構(gòu)函數(shù)就會(huì)被自動(dòng)調(diào)用,由于析構(gòu)函數(shù)調(diào)用了VariantClear,因而相應(yīng)的內(nèi)存就會(huì)被自動(dòng)清除。除此之外,COleVariant的賦值操作符在與VARIANT類型轉(zhuǎn)換中為我們提供極大的方便。例如下面的代碼:

COleVariant v1("This is a test"); // 直接構(gòu)造
COleVariant v2 = "This is a test";
// 結(jié)果是VT_BSTR類型,值為"This is a test"
COleVariant v3((long)2002);
COleVariant v4 = (long)2002;
// 結(jié)果是VT_I4類型,值為2002

  _variant_t是一個(gè)用于COM的VARIANT類,它的功能與COleVariant相似。不過在Visual C++.NET的MFC應(yīng)用程序中使用時(shí)需要在代碼文件前面添加下列兩句:

  #include "comutil.h"

  #pragma comment( lib, "comsupp.lib" )

四、CComBSTR和_bstr_t

  CComBSTR是對(duì)BSTR數(shù)據(jù)類型封裝的一個(gè)ATL類,它的操作比較方便。例如:

CComBSTR bstr1;
bstr1 = "Bye"; // 直接賦值
OLECHAR* str = OLESTR("ta ta"); // 長度為5的寬字符
CComBSTR bstr2(wcslen(str)); // 定義長度為5
wcscpy(bstr2.m_str, str); // 將寬字符串復(fù)制到BSTR中
CComBSTR bstr3(5, OLESTR("Hello World"));
CComBSTR bstr4(5, "Hello World");
CComBSTR bstr5(OLESTR("Hey there"));
CComBSTR bstr6("Hey there");
CComBSTR bstr7(bstr6);
// 構(gòu)造時(shí)復(fù)制,內(nèi)容為"Hey there"

  _bstr_t是是C++對(duì)BSTR的封裝,它的構(gòu)造和析構(gòu)函數(shù)分別調(diào)用SysAllocString和SysFreeString函數(shù),其他操作是借用BSTR API函數(shù)。與_variant_t相似,使用時(shí)也要添加comutil.h和comsupp.lib。

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

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

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

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)類型,常常使用下列三種方法:

  方法一,使用強(qiáng)制轉(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)的第二個(gè)參數(shù)是 const wchar_t* (Unicode)或const char* (ANSI),系統(tǒng)編譯器將會(huì)自動(dòng)對(duì)其進(jìn)行轉(zhuǎn)換。

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

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

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

  方法一,使用ConvertBSTRToString。例如:

#include "comutil.h"
#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;
}

   ** 此方法不好,會(huì)造成內(nèi)存泄露,SysFreeString也沒有效果。

  方法二,使用_bstr_t的賦值運(yùn)算符重載。例如:

_bstr_t b = bstrText;
char* lpszText2 = b;   

* 不會(huì)有內(nèi)存泄露,推薦方法

  (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來實(shí)現(xiàn)。例如:

CString str("This is a test");
BSTR bstrText = str.AllocSysString();

SysFreeString(bstrText); // 用完釋放

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

  一般可按下列方法進(jìn)行:

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*對(duì)象。例如:

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)一形式:

  其中,第一個(gè)C表示“類”,以便于ATL 3.0宏相區(qū)別,第二個(gè)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);

posted on 2008-08-10 10:26 cpsprogramer 閱讀(19359) 評(píng)論(1)  編輯 收藏 引用 所屬分類: VC++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区视频在线| 欧美呦呦网站| 久久久www免费人成黑人精品 | 欧美风情在线| 欧美69wwwcom| 欧美激情片在线观看| 欧美日韩福利视频| 国产精品成人一区二区| 国产嫩草一区二区三区在线观看 | 国产一区二区日韩精品欧美精品| 国产精品视频一| 国产婷婷一区二区| 国产视频精品免费播放| 在线成人免费观看| 一本色道久久综合狠狠躁篇怎么玩| 夜夜爽www精品| 久久狠狠亚洲综合| 亚洲国产精品久久久久秋霞蜜臀| 欧美福利视频| 99视频一区二区| 久久9热精品视频| 欧美日韩第一区| 伊人激情综合| 亚洲欧美另类在线观看| 麻豆久久精品| 亚洲一区二区三区高清不卡| 欧美在线免费看| 欧美三级欧美一级| 久久国产精品一区二区| 在线精品国精品国产尤物884a| 狠狠入ady亚洲精品| 日韩小视频在线观看| 久久久久在线观看| 99re66热这里只有精品3直播| 香蕉乱码成人久久天堂爱免费| 欧美肥婆在线| 精品动漫3d一区二区三区| 免费在线成人av| 国产精品一二一区| 夜夜嗨一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频| 中日韩男男gay无套 | 欧美成人午夜激情在线| 国产亚洲美州欧州综合国| 一区二区三区视频观看| 欧美xxxx在线观看| 午夜免费久久久久| 欧美三级在线视频| aaa亚洲精品一二三区| 欧美国产精品劲爆| 久久久久高清| 在线观看福利一区| 麻豆精品传媒视频| 久久精品欧美日韩| 久久九九精品99国产精品| 国产精品毛片| 亚洲欧美不卡| 亚洲午夜久久久| 欧美视频一区二区三区| 日韩一区二区精品葵司在线| 欧美成人免费全部| 久久在线视频| 亚洲人www| 亚洲日本欧美| 欧美日韩午夜| 亚洲欧美另类在线| 亚洲在线网站| 国产一区二区三区高清| 久久综合免费视频影院| 久久久国产一区二区| 亚洲第一主播视频| 亚洲黄色视屏| 欧美性猛交99久久久久99按摩| 一区二区三区毛片| 亚洲午夜精品一区二区| 国产日韩欧美中文| 美女国内精品自产拍在线播放| 久久精品日产第一区二区三区| 狠久久av成人天堂| 欧美激情中文字幕在线| 欧美精品一区视频| 午夜在线电影亚洲一区| 欧美亚洲在线| 亚洲激情在线播放| 99pao成人国产永久免费视频| 国产精品久久影院| 免费不卡在线观看av| 一片黄亚洲嫩模| 国内成人精品视频| 一区视频在线播放| 亚洲激情视频网站| 国产精品高清免费在线观看| 先锋a资源在线看亚洲| 久久不射电影网| 亚洲啪啪91| 中国成人在线视频| 狠狠色丁香婷婷综合久久片| 欧美国产视频在线观看| 国产精品免费看片| 亚洲国产精品尤物yw在线观看| 欧美亚一区二区| 玖玖玖国产精品| 国产精品二区二区三区| 欧美大片一区二区| 国产精品入口麻豆原神| 亚洲国产精品成人综合色在线婷婷| 欧美日韩日韩| 免费在线观看日韩欧美| 国产精品一区在线观看你懂的| 欧美a级一区| 国产精品美女www爽爽爽| 亚洲国产美国国产综合一区二区| 国产精品一区视频网站| 日韩亚洲欧美一区二区三区| 国内精品美女在线观看| 一区二区三区欧美在线| 亚洲国产一区二区三区在线播 | 亚洲精品在线电影| 亚洲高清视频在线观看| 校园春色国产精品| 午夜久久一区| 国产精品xvideos88| 亚洲精品孕妇| 在线亚洲欧美视频| 欧美伦理a级免费电影| 亚洲高清不卡一区| 亚洲国产第一页| 久久亚洲精选| 欧美刺激午夜性久久久久久久| 国语自产精品视频在线看抢先版结局| 亚洲一区二区三区精品在线 | 国产亚洲美州欧州综合国| 中日韩美女免费视频网址在线观看| 亚洲欧洲一区二区三区在线观看| 久久99在线观看| 久久综合久久综合久久| 国产美女高潮久久白浆| 亚洲欧美中文字幕| 久久国产精彩视频| 国产专区综合网| 久久高清福利视频| 久久综合久久88| 在线看日韩欧美| 欧美成人激情视频| 亚洲精品久久在线| 亚洲一区亚洲二区| 国产麻豆日韩| 久久精品噜噜噜成人av农村| 美女黄网久久| 欧美久久久久免费| 久久久久免费观看| 国产伦精品一区二区三区照片91 | 亚洲午夜性刺激影院| 欧美一区二区三区啪啪| 日韩亚洲精品在线| 日韩网站在线| 欧美激情一区二区三区在线视频| 美女被久久久| 亚洲精选在线观看| 欧美啪啪一区| 亚洲一区二区视频在线观看| 欧美专区在线观看一区| 激情久久五月天| 欧美福利一区二区| 一区二区三区精品久久久| 性欧美激情精品| 亚洲电影毛片| 欧美日本一道本在线视频| 一区二区免费在线播放| 欧美在线免费一级片| 亚洲国产一区二区精品专区| 欧美日本三级| 欧美一区二区在线观看| 欧美激情在线免费观看| 午夜精品久久久久久99热软件| 伊人久久大香线蕉av超碰演员| 欧美丰满高潮xxxx喷水动漫| 在线视频一区二区| 免费一区二区三区| 小嫩嫩精品导航| 一区二区亚洲| 欧美日韩免费观看一区三区 | 欧美a级片网| 亚洲欧美国产精品专区久久| 在线精品视频一区二区三四| 欧美三级在线播放| 老色鬼精品视频在线观看播放| 中文成人激情娱乐网| 欧美二区在线播放| 久久精品一本久久99精品| 亚洲香蕉在线观看| 亚洲国产一区二区视频| 国模 一区 二区 三区| 欧美日韩综合视频| 欧美国产日韩免费| 久久国产精品久久久久久电车| 一区二区三区国产精品| 欧美国产视频在线| 免费在线观看一区二区| 久久久久这里只有精品|