亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? visual c++.net中 字符串轉換方法.txt

?? Visual C++.NET中 字符串轉換方法.txt
?? TXT
字號:
Visual C++.NET涉及到ATL/ATL Server、MFC和托管C++等多種編程方式,不僅功能強大而且應用廣泛。在編程中,我們常常會遇到ANSI、Unicode以及BSTR不同編碼類型的字符串轉換操作。本文先介紹基本字符串類型,然后說明相關的類,如CComBSTR、_bstr_t、CStringT等,最后討論它們的轉換方法,其中還包括使用最新ATL7.0的轉換類和宏,如CA2CT、CA2TEX等。

  一、BSTR、LPSTR和LPWSTR

  在Visual C++.NET的所有編程方式中,我們常常要用到這樣的一些基本字符串類型,如BSTR、LPSTR和LPWSTR等。之所以出現類似上述的這些數據類型,是因為不同編程語言之間的數據交換以及對ANSI、Unicode和多字節字符集(MBCS)的支持。

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

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

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

  例如,LPCTSTR是指“long pointer to a constant generic string”,表示“一個指向一般字符串常量的長指針類型”,與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平臺中等同于WCHAR(16位Unicode字符),在ANSI中等價于char。wchar_t通常定義為unsigned short。由于CString在MFC應用程序中經常用到,這里不再重復。

  三、VARIANT、COleVariant 和_variant_t

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

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類型是一個C結構,它包含了一個類型成員vt、一些保留字節以及一個大的union類型。例如,如果vt為VT_I2,那么我們可以從iVal中讀出VARIANT的值。同樣,當給一個VARIANT變量賦值時,也要先指明其類型。例如:

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

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

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

  VariantClear —— 消除并初始化VARIANT;

  VariantChangeType —— 改變VARIANT的類型;

  VariantCopy —— 釋放與目標VARIANT相連的內存并復制源VARIANT。

  COleVariant類是對VARIANT結構的封裝。它的構造函數具有極為強大大的功能,當對象構造時首先調用VariantInit進行初始化,然后根據參數中的標準類型調用相應的構造函數,并使用VariantCopy進行轉換賦值操作,當VARIANT對象不在有效范圍時,它的析構函數就會被自動調用,由于析構函數調用了VariantClear,因而相應的內存就會被自動清除。除此之外,COleVariant的賦值操作符在與VARIANT類型轉換中為我們提供極大的方便。例如下面的代碼:

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

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

  #include "comutil.h"

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

  四、CComBSTR和_bstr_t

  CComBSTR是對BSTR數據類型封裝的一個ATL類,它的操作比較方便。例如:

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

  _bstr_t是是C++對BSTR的封裝,它的構造和析構函數分別調用SysAllocString和SysFreeString函數,其他操作是借用BSTR API函數。與_variant_t相似,使用時也要添加comutil.h和comsupp.lib。


---------------------------------------------
五、BSTR、char*和CString轉換

  (1) char*轉換成CString

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

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

  或

LPSTR p = "This is a test"; 

  或在已定義Unicode應的用程序中

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轉換成char*

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

  方法一,使用強制轉換。例如:

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)的第二個參數是 const wchar_t* (Unicode)或const char* (ANSI),系統編譯器將會自動對其進行轉換。

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

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

  (3) BSTR轉換成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*轉換成BSTR

  方法一,使用SysAllocString等API函數。例如:

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轉換成BSTR

  通常是通過使用CStringT::AllocSysString來實現。例如:

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

  (6) BSTR轉換成CString

  一般可按下列方法進行:

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

  或

CStringA str(bstrText); 

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

  方法一,使用MultiByteToWideChar將ANSI字符轉換成Unicode字符,使用WideCharToMultiByte將Unicode字符轉換成ANSI字符。

  方法二,使用“_T”將ANSI轉換成“一般”類型字符串,使用“L”將ANSI轉換成Unicode,而在托管C++環境中還可使用S將ANSI字符串轉換成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的轉換宏和類。ATL7.0在原有3.0基礎上完善和增加了許多字符串轉換宏以及提供相應的類,它具有如圖3所示的統一形式:

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

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);  

  六、結語

  幾乎所有的程序都要用到字符串,而Visual C++.NET由于功能強大、應用廣泛,因而字符串之間的轉換更為頻繁。本文幾乎涉及到目前的所有轉換方法。當然對于.NET框架來說,還可使用Convert和Text類進行不同數據類型以及字符編碼之間的相互轉換。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
2014亚洲片线观看视频免费| 日本欧美一区二区| 午夜精品福利久久久| 国产成人av电影| 精品视频999| 欧美激情一区二区三区不卡| 亚洲二区在线观看| 成人av综合在线| 日韩欧美资源站| 亚洲精品免费一二三区| 国产精品一区二区无线| 欧美精品 国产精品| 亚洲色图视频网站| 福利视频网站一区二区三区| 日韩视频永久免费| 日韩精品三区四区| 欧美亚洲一区二区三区四区| ㊣最新国产の精品bt伙计久久| 久久爱www久久做| 欧美福利视频一区| 亚洲一区二区三区在线播放| 99久久精品费精品国产一区二区| 国产欧美一区二区精品性色超碰| 天堂在线一区二区| 欧美三电影在线| 亚洲男人的天堂在线aⅴ视频| 成人影视亚洲图片在线| 久久毛片高清国产| 精品一二三四在线| 精品国产精品网麻豆系列| 日韩在线a电影| 欧美一区二区三区思思人| 亚洲国产欧美另类丝袜| 欧美网站一区二区| 午夜不卡av在线| 欧美精品一级二级| 蜜臀av一区二区| 日韩视频一区二区在线观看| 日本不卡视频在线| 26uuu国产电影一区二区| 国产一区二区视频在线播放| 久久综合久久久久88| 国产精品一二三四区| 中文字幕电影一区| 99这里只有久久精品视频| 国产精品美女一区二区在线观看| 波多野结衣中文一区| 亚洲欧洲国产日韩| 欧美在线一二三| 麻豆精品久久精品色综合| 精品久久人人做人人爱| 国产91富婆露脸刺激对白| 国产精品视频线看| 欧美亚洲另类激情小说| 秋霞影院一区二区| 国产丝袜在线精品| 91丨porny丨最新| 五月激情综合婷婷| 精品国产91亚洲一区二区三区婷婷| 韩国毛片一区二区三区| 亚洲少妇30p| 欧美高清视频一二三区 | 国产成人在线免费观看| 中文子幕无线码一区tr| 精品视频1区2区3区| 精品一区二区在线免费观看| ...av二区三区久久精品| 欧美日韩免费视频| 国产美女精品在线| 亚洲资源中文字幕| 国产三级精品三级在线专区| 色av成人天堂桃色av| 激情五月激情综合网| 亚洲精品伦理在线| 精品国产乱码久久久久久久| 色哟哟欧美精品| 国产综合色视频| 亚洲成人av一区二区三区| 国产三级精品视频| 欧美精品1区2区3区| 91一区二区在线观看| 国产一区二区导航在线播放| 亚洲国产日韩精品| 中国av一区二区三区| 日韩欧美一区二区不卡| 日本韩国欧美国产| 高清久久久久久| 麻豆精品在线看| 亚洲成人激情社区| 亚洲精品国产精品乱码不99| 久久综合色天天久久综合图片| 欧美三级在线看| 99re在线视频这里只有精品| 久久99国产精品久久| 日韩成人伦理电影在线观看| 亚洲黄色尤物视频| 国产精品久久精品日日| 久久久91精品国产一区二区三区| 91精品欧美久久久久久动漫| 91福利在线观看| 不卡一区在线观看| 国产mv日韩mv欧美| 国产一区二区精品在线观看| 奇米亚洲午夜久久精品| 五月天欧美精品| 亚洲国产sm捆绑调教视频| 成人欧美一区二区三区| 亚洲欧洲一区二区在线播放| 亚洲国产成人午夜在线一区| www日韩大片| 26uuu色噜噜精品一区二区| 日韩一区二区三区av| 欧美久久免费观看| 欧美人狂配大交3d怪物一区| 欧美日韩国产精品成人| 欧美私人免费视频| 欧美日韩免费不卡视频一区二区三区| va亚洲va日韩不卡在线观看| 成人av资源站| 91啪亚洲精品| 在线免费观看日韩欧美| 欧美亚洲尤物久久| 69堂国产成人免费视频| 日韩亚洲国产中文字幕欧美| 欧美一级日韩不卡播放免费| 日韩一区二区视频| 久久嫩草精品久久久精品一| 久久精品男人天堂av| 国产欧美日韩久久| 亚洲婷婷在线视频| 亚洲午夜精品网| 久久精品噜噜噜成人av农村| 久久国产日韩欧美精品| 国产精品亚洲专一区二区三区| 国产精品影视在线| 色哟哟一区二区| 91精品国产日韩91久久久久久| 日韩精品综合一本久道在线视频| 精品国产一二三区| 国产精品毛片高清在线完整版| 亚洲欧洲国产专区| 日韩不卡一区二区| 国产精品99久久久久久似苏梦涵| 成人美女在线视频| 欧美丰满一区二区免费视频 | 91国产精品成人| 日韩欧美亚洲另类制服综合在线| 久久久蜜臀国产一区二区| 中文字幕视频一区| 日韩avvvv在线播放| 国产精品99久久久久久有的能看| 色噜噜久久综合| 精品国内二区三区| 亚洲激情自拍视频| 六月丁香婷婷色狠狠久久| 成人av高清在线| 欧美一区二区三区色| 日本一区二区三区视频视频| 亚洲一区二区三区影院| 国产毛片精品视频| 在线免费观看成人短视频| 久久婷婷综合激情| 亚洲香蕉伊在人在线观| 国产盗摄一区二区| 在线播放日韩导航| 亚洲天堂成人在线观看| 麻豆视频观看网址久久| 色婷婷综合久色| 欧美激情一区二区三区四区| 日本视频免费一区| 色天使色偷偷av一区二区| 2020日本不卡一区二区视频| 婷婷综合五月天| 99久久国产综合色|国产精品| 欧美成人精品1314www| 亚洲成人免费观看| 色综合夜色一区| 欧美激情综合在线| 国产一区欧美二区| 欧美一区二区免费视频| 亚洲在线视频免费观看| 99久久精品国产导航| 国产农村妇女精品| 国产精品影音先锋| 日韩小视频在线观看专区| 丝袜美腿亚洲色图| 欧美在线免费观看亚洲| 亚洲在线中文字幕| 色噜噜久久综合| 亚洲精品国产精品乱码不99| 91首页免费视频| 亚洲三级在线免费| av网站一区二区三区| 国产精品久久久一本精品| 成人av在线观| 综合久久国产九一剧情麻豆| 99九九99九九九视频精品| **性色生活片久久毛片| 91美女蜜桃在线| 一区二区激情视频|