vc++类型转换
一.VC常用數(shù)據(jù)類型列表
二.常用數(shù)據(jù)類型轉(zhuǎn)化
2.1數(shù)學(xué)類型變量與字符串相互轉(zhuǎn)換
2.2 CString及string,char *與其他數(shù)據(jù)類型的轉(zhuǎn)換和操作
●CString,string,char*的綜合比較
●數(shù)學(xué)類型與CString相互轉(zhuǎn)化
●CString與char*相互轉(zhuǎn)換舉例
●CString 與 BSTR 型轉(zhuǎn)換
●VARIANT 型轉(zhuǎn)化成 CString 型
2.3 BSTR、_bstr_t與CComBSTR
2.4 VARIANT 、_variant_t 與 COleVariant
附錄CString及字符串轉(zhuǎn)及操作詳解
?
參考書籍:CSDN,<<MFC深入淺出(Second Edit)>>
?????? ??????????????????????一.VC常用數(shù)據(jù)類型列表
| ? | Type | Default Size | Description |
| ? ? ? ? 基 礎(chǔ) 類 型 ? 全 是 小 寫 ? | 說(shuō)明:這些基礎(chǔ)數(shù)據(jù)類型對(duì)于MFC還是API都是被支持的 | ||
| boolean | unsigned 8 bit , | 取值TRUE/FALSE | |
| byte | unsigned 8 bit, | 整數(shù),輸出按字符輸出 | |
| char | unsigned 8 bit, | 字符 | |
| double | signed 64 bit | 浮點(diǎn)型 | |
| float | signed32 bit | 浮點(diǎn)型 | |
| handle_t | ? | Primitive handle type | |
| hyper | signed 64 bit | 整型 | |
| int | signed 32 bit | 整型 | |
| long | signed 32 bit | 整型 | |
| short | signed 16 bit | 整型 | |
| small | signed 8 bit | 整型 | |
| void * | 32-bit | 指向未知類型的指針 | |
| wchar_t | unsigned 16 bit | 16位字符,比char可容納更多的字符 | |
| ? | ? | ? | |
| Win32 API 常 用 數(shù) 據(jù) 類 型 ? 全 大 寫 | 說(shuō)明: 這些Win32API支持的簡(jiǎn)單數(shù)據(jù)類型主要是用來(lái)定義函數(shù)返回值,消息參數(shù),結(jié)構(gòu)成員。這類數(shù)據(jù)類型大致可以分為五大類:字符型、布爾型、整型、指針型和句柄型(?). 總共大概有100多種不同的類型, | ||
| BOOL/BOOLEAN | 8bit,TRUE/FALSE | 布爾型 | |
| BYTE | unsigned 8 bit | ? | |
| BSTR CComBSTR _bstr_t | 32 bit | BSTR是指向字符串的32位指針 是對(duì)BSTR的封裝 是對(duì)BSTR的封裝 | |
| CHAR | 8 bit | (ANSI)字符類型 | |
| COLORREF | 32 bit | RGB顏色值 整型 | |
| DWORD | unsigned 32 bit | 整型 | |
| FLOAT | float型 | float型 | |
| HANDLE | ? | Object句柄 | |
| HBITMAP | ? | bitmap句柄 | |
| HBRUSH | ? | brush句柄 | |
| HCURSOR | ? | cursor句柄 | |
| HDC | ? | 設(shè)備上下文句柄 | |
| HFILE | ? | OpenFile打開的File句柄 | |
| HFONT | ? | font句柄 | |
| HHOOK | ? | hook句柄 | |
| HKEY | ? | 注冊(cè)表鍵句柄 | |
| HPEN | ? | pen句柄 | |
| HWND | ? | window句柄 | |
| INT | -------- | -------- | |
| LONG | -------- | --------- | |
| LONGLONG | ? | 64位帶符號(hào)整型 | |
| LPARAM | 32 bit | 消息參數(shù) | |
| LPBOOL | ? | BOOL型指針 | |
| LPBYTE | ? | BYTE型指針 | |
| LPCOLOREF | ? | COLORREF型指針 | |
| LPCSTR/LPSTR/PCSTR | ? | 指向8位(ANSI)字符串類型指針 | |
| LPCWSTR/LPWSTR/PCWSTR | ? | 指向16位Unicode字符串類型 | |
| LPCTSTR/LPTSTR/PCTSTR | ? | 指向一8位或16位字符串類型指針 | |
| LPVOID | ? | 指向一個(gè)未指定類型的32位指針 | |
| LPDWORD | ? | 指向一個(gè)DWORD型指針 | |
| 其他相似類型: LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULT PBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT…… 說(shuō)明:(1)在16位系統(tǒng)中 LP為16bit,P為8bit,在32位系統(tǒng)中都是32bit(此時(shí)等價(jià)) (2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODE | |||
| SHORT | usigned | 整型 | |
| 其他UCHAR、UINT、ULONG、ULONGLONG、USHORT為無(wú)符號(hào)相應(yīng)類型 | |||
| TBYTE | ? | WCHAR型或者CHAR型 | |
| TCHAR | ? | ANSI與unicode均可 | |
| VARIANT _variant_t COleVariant | ? | 一個(gè)結(jié)構(gòu)體參考OAIDL.H _variant_t是VARIANT的封裝類 COleVariant也是VARIANT的封裝類 | |
| ? | ? | ? | |
| ? | ? | ? | |
| WNDPROC | ? | 指向一個(gè)窗口過(guò)程的32位指針 | |
| WCHAR | ? | 16位Unicode字符型 | |
| WORD | ? | 16位無(wú)符號(hào)整型 | |
| WPARAM | ? | 消息參數(shù) | |
| MFC 獨(dú)有 數(shù)據(jù) 類型 | 下面兩個(gè)數(shù)據(jù)類型是微軟基礎(chǔ)類庫(kù)中獨(dú)有的數(shù)據(jù)類型 | ||
| POSITION | 標(biāo)記集合中一個(gè)元素的位置的值,被MFC中的集合類所使用 | ||
| LPCRECT | 指向一個(gè)RECT結(jié)構(gòu)體常量(不能修改)的32位指針 | ||
| CString | 其實(shí)是MFC中的一個(gè)類 | ||
| ? | ? | ? | |
說(shuō)明:
(1)-------表示省略
(2)1Byte=8Bit,
字與機(jī)器有關(guān),在8位系統(tǒng)中:字=1字節(jié),16位系統(tǒng)中,1字=2字節(jié),32位中:1字=4字節(jié),
64位中1字=8字節(jié).不要搞混這些概念.
?
?
二.常用數(shù)據(jù)類型轉(zhuǎn)化及操作
2.1 數(shù)學(xué)類型變量與字符串相互轉(zhuǎn)換(這些函數(shù)都在STDLIB.H里)
(1)將數(shù)學(xué)類型轉(zhuǎn)換為字符串可以用以下一些函數(shù):
舉例: _CRTIMP char * __cdecl _itoa(int, char *, int);//這是一個(gè)將數(shù)字轉(zhuǎn)換為一個(gè)字符串類型的函數(shù),最后一個(gè)int表示轉(zhuǎn)換的進(jìn)制
如以下程序:
int iTyep=3;
char *szChar;
itoa(iType,szChar,2);
cout<<szChar;//輸出為1010
類似函數(shù)列表:
_CRTIMP char * __cdecl _itoa(int, char *, int);//為了完整性,也列在其中
_CRTIMP char * __cdecl _ultoa(unsigned long, char *, int);
_CRTIMP char * __cdecl _ltoa(long, char *, int);
_CRTIMP char * __cdecl _i64toa(__int64, char *, int);
_CRTIMP char * __cdecl _ui64toa(unsigned __int64, char *, int);
_CRTIMP wchar_t * __cdecl _i64tow(__int64, wchar_t *, int);
_CRTIMP wchar_t * __cdecl _ui64tow(unsigned __int64, wchar_t *, int);
_CRTIMP wchar_t * __cdecl _itow (int, wchar_t *, int);//轉(zhuǎn)換為長(zhǎng)字符串類型
_CRTIMP wchar_t * __cdecl _ltow (long, wchar_t *, int);
_CRTIMP wchar_t * __cdecl _ultow (unsigned long, wchar_t *, int);
還有很多,請(qǐng)自行研究
(2)將字符串類型轉(zhuǎn)換為數(shù)學(xué)類型變量可以用以下一些函數(shù):
舉例: _CRTIMP int? __cdecl atoi(const char *);//參數(shù)一看就很明了
char *szChar=”88”;
int temp(0);
temp=atoi(szChar);
cout<<temp;
類似的函數(shù)列表:
_CRTIMP int??? __cdecl atoi(const char *);
_CRTIMP double __cdecl atof(const char *);
_CRTIMP long?? __cdecl atol(const char *);
_CRTIMP long double __cdecl _atold(const char *);
_CRTIMP __int64 __cdecl _atoi64(const char *);
_CRTIMP double __cdecl strtod(const char *, char **);//
_CRTIMP long?? __cdecl strtol(const char *, char **, int);//
_CRTIMP long double __cdecl _strtold(const char *, char **);
_CRTIMP unsigned long __cdecl strtoul(const char *, char **, int);
_CRTIMP double __cdecl wcstod(const wchar_t *, wchar_t **);//長(zhǎng)字符串類型轉(zhuǎn)換為數(shù)學(xué)類型
_CRTIMP long?? __cdecl wcstol(const wchar_t *, wchar_t **, int);
_CRTIMP unsigned long __cdecl wcstoul(const wchar_t *, wchar_t **, int);
_CRTIMP int __cdecl _wtoi(const wchar_t *);
_CRTIMP long __cdecl _wtol(const wchar_t *);
_CRTIMP __int64?? __cdecl _wtoi64(const wchar_t *);
還有很多,請(qǐng)自行研究
2.2.CString及string,char *與其他數(shù)據(jù)類型的轉(zhuǎn)換和操作
(1)CString,string,char*的綜合比較(這部分CSDN上的作者joise的文章
<< CString,string,char*的綜合比較>>寫的很詳細(xì),請(qǐng)大家在仔細(xì)閱讀他的文章.
地址:?http://blog.csdn.net/joise/
或參考附錄:
(2)轉(zhuǎn)換:
●數(shù)學(xué)類型與CString相互轉(zhuǎn)化
?數(shù)學(xué)類型轉(zhuǎn)化為CString
可用Format函數(shù),舉例:
CString s;
int i = 64;
s.Format("%d", i)
CString轉(zhuǎn)換為數(shù)學(xué)類型:舉例CString strValue("1.234");
double dblValue;
dblValue = atof((LPCTSTR)strValue);
●CString與char*相互轉(zhuǎn)換舉例
CString strValue(“Hello”);
char *szValue;
szValue=strValue.GetBuffer(szValue);
也可用(LPSTR)(LPCTSTR)對(duì)CString//??進(jìn)行強(qiáng)制轉(zhuǎn)換.??
szValue=(LPSTR)(LPCTSTR)strValue;
反過(guò)來(lái)可直接賦值:
char *szChar=NULL;
CString strValue;
szChar=new char[10];
memset(szChar,0,10);
strcpy(szChar,”Hello”);
strValue=szChar;
●CString 與 BSTR 型轉(zhuǎn)換
CString 型轉(zhuǎn)化成 BSTR 型
當(dāng)我們使用 ActiveX 控件編程時(shí),經(jīng)常需要用到將某個(gè)值表示成 BSTR 類型.BSTR 是一種記數(shù)字符串,Intel平臺(tái)上的寬字符串(Unicode),并且可以包含嵌入的 NULL 字符。
可以調(diào)用 CString 對(duì)象的 AllocSysString 方法將 CString 轉(zhuǎn)化成 BSTR:
CString str;
str = .....; // whatever
BSTR bStr = str.AllocSysString();
?
BSTR型轉(zhuǎn)換為CString
如果你在 UNICODE 模式下編譯代碼,你可以簡(jiǎn)單地寫成:
CString convert(BSTR bStr)
{
??? if(bStr == NULL)
??????? return CString(_T(""));
??? CString s(bStr); // in UNICODE mode
??? return s;
}
如果是 ANSI 模式
CString convert(BSTR b)
{
??? CString s;
??? if(b == NULL)
?????? return s; // empty for NULL BSTR
#ifdef UNICODE
??? s = b;
#else
??? LPSTR p = s.GetBuffer(SysStringLen(b) + 1);
??? ::WideCharToMultiByte(CP_ACP,??????????? // ANSI Code Page
?? ???????????????????????0,???????????????? // no flags
????????????????????????? b,???????????????? // source widechar string
????????????????????????? -1,??????????????? // assume NUL-terminated
????????????????????????? p,???????????????? // target buffer
????????????????????????? SysStringLen(b)+1, // target buffer length
????????????????????????? NULL,????????????? // use system default char
????????????????????????? NULL);???????????? // don''t care if default used
??? s.ReleaseBuffer();
#endif
??? return s;
}
●VARIANT 型轉(zhuǎn)化成 CString 型
VARIANT 類型經(jīng)常用來(lái)給 COM 對(duì)象傳遞參數(shù),或者接收從 COM 對(duì)象返回的值。你也能自己編寫返回 VARIANT 類型的方法,函數(shù)返回什么類型 依賴可能(并且常常)方法的輸入?yún)?shù)(比如,在自動(dòng)化操作中,依賴與你調(diào)用哪個(gè)方法。IDispatch::Invoke 可能返回(通過(guò)其一個(gè)參數(shù))一個(gè) 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 類型的結(jié)果,(詳見(jiàn) MSDN 上的 VARIANT 結(jié)構(gòu)的定義)。在下面的例子中,假設(shè) 類型是一個(gè)BSTR的變體,也就是說(shuō)在串中的值是通過(guò) bsrtVal 來(lái)引用,其優(yōu)點(diǎn)是在 ANSI 應(yīng)用中,有一個(gè)構(gòu)造函數(shù)會(huì)把 LPCWCHAR 引用的值轉(zhuǎn)換為一個(gè) CString(見(jiàn) BSTR-to-CString 部分)。在 Unicode 模式中,將成為標(biāo)準(zhǔn)的 CString 構(gòu)造函數(shù),參見(jiàn)對(duì)缺省::WideCharToMultiByte 轉(zhuǎn)換的告誡,以及你覺(jué)得是否可以接受(大多數(shù)情況下,你會(huì)滿意的)。VARIANT vaData;
vaData = m_com.YourMethodHere();
ASSERT(vaData.vt == VT_BSTR);
CString strData(vaData.bstrVal);
你還可以根據(jù) vt 域的不同來(lái)建立更通用的轉(zhuǎn)換例程。為此你可能會(huì)考慮:
CString VariantToString(VARIANT * va)
{
??? CString s;
??? switch(va->vt)
????? { /* vt */
?????? case VT_BSTR:
????????? return CString(vaData->bstrVal);
?????? case VT_BSTR | VT_BYREF:
????????? return CString(*vaData->pbstrVal);
?????? case VT_I4:
????????? s.Format(_T("%d"), va->lVal);
????????? return s;
?????? case VT_I4 | VT_BYREF:
????????? s.Format(_T("%d"), *va->plVal);
?????? case VT_R8:
????????? s.Format(_T("%f"), va->dblVal);
????????? return s;
?????? ... 剩下的類型轉(zhuǎn)換由讀者自己完成
?????? default:
????????? ASSERT(FALSE); // unknown VARIANT type (this ASSERT is optional)
????????? return CString("");
????? } /* vt */
}
?
2.3 BSTR、_bstr_t與CComBSTR
CComBSTR、_bstr_t是對(duì)BSTR的封裝,BSTR是指向字符串的32位指針。
char *轉(zhuǎn)換到BSTR可以這樣:
BSTR b=_com_util::ConvertStringToBSTR("數(shù)據(jù)");///使用前需要加上頭文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);
2.4(引)VARIANT 、_variant_t 與 COleVariant
VARIANT的結(jié)構(gòu)可以參考頭文件VC98\Include\OAIDL.H中關(guān)于結(jié)構(gòu)體tagVARIANT的定義。
對(duì)于VARIANT變量的賦值:首先給vt成員賦值,指明數(shù)據(jù)類型,再對(duì)聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類型的變量賦值,舉個(gè)例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型數(shù)據(jù)
va.lVal=a; ///賦值
對(duì)于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進(jìn)行初始化,其本質(zhì)是將vt設(shè)置為VT_EMPTY,下表我們列舉vt與常用數(shù)據(jù)的對(duì)應(yīng)關(guān)系:
unsigned char bVal; VT_UI1
short iVal; VT_I2
long lVal; VT_I4
float fltVal; VT_R4
double dblVal; VT_R8
VARIANT_BOOL boolVal; VT_BOOL
SCODE scode; VT_ERROR
CY cyVal; VT_CY
DATE date; VT_DATE
BSTR bstrVal; VT_BSTR
IUnknown FAR* punkVal; VT_UNKNOWN
IDispatch FAR* pdispVal; VT_DISPATCH
SAFEARRAY FAR* parray; VT_ARRAY|*
unsigned char FAR* pbVal; VT_BYREF|VT_UI1
short FAR* piVal; VT_BYREF|VT_I2
long FAR* plVal; VT_BYREF|VT_I4
float FAR* pfltVal; VT_BYREF|VT_R4
double FAR* pdblVal; VT_BYREF|VT_R8
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
SCODE FAR* pscode; VT_BYREF|VT_ERROR
CY FAR* pcyVal; VT_BYREF|VT_CY
DATE FAR* pdate; VT_BYREF|VT_DATE
BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR
IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH
SAFEARRAY FAR* FAR* pparray; VT_ARRAY|*
VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT
void FAR* byref; VT_BYREF
_variant_t是VARIANT的封裝類,其賦值可以使用強(qiáng)制類型轉(zhuǎn)換,其構(gòu)造函數(shù)會(huì)自動(dòng)處理這些數(shù)據(jù)類型。
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant的使用與_variant_t的方法基本一樣,請(qǐng)參考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;
?
VC++.NET中字符串之間的轉(zhuǎn)換?
一、BSTR、LPSTR和LPWSTR?
在Visual C++.NET的所有編程方式中,我們常常要用到這樣的一些基本字符串類型,如BSTR、LPSTR和LPWSTR等。之所以出現(xiàn)類似上述的這些數(shù)據(jù)類型,是因?yàn)椴煌幊陶Z(yǔ)言之間的數(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)來(lái)管理它以及一些默認(rèn)的調(diào)度代碼,因此BSTR實(shí)際上就是一個(gè)COM字符串,但它卻在自動(dòng)化技術(shù)以外的多種場(chǎng)合下得到廣泛使用。圖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是指“l(fā)ong pointer to a constant generic string”,表示“一個(gè)指向一般字符串常量的長(zhǎng)指針類型”,與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ù)的傳輸。下面讓我們來(lái)看看OAIDL.H文件中VARIANT定義的一個(gè)簡(jiǎn)化版:?
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相似。不過(guò)在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"); // 長(zhǎng)度為5的寬字符?
CComBSTR bstr2(wcslen(str)); // 定義長(zhǎng)度為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);?
需要說(shuō)明的是,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?
#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的賦值運(yùn)算符重載。例如:?
_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,這是一種最簡(jiǎn)單的方法。例如:?
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?
通常是通過(guò)使用CStringT::AllocSysString來(lái)實(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);?
六、結(jié)語(yǔ)?
幾乎所有的程序都要用到字符串,而Visual C++.NET由于功能強(qiáng)大、應(yīng)用廣泛,因而字符串之間的轉(zhuǎn)換更為頻繁。本文幾乎涉及到目前的所有轉(zhuǎn)換方法。當(dāng)然對(duì)于.NET框架來(lái)說(shuō),還可使用Convert和Text類進(jìn)行不同數(shù)據(jù)類型以及字符編碼之間的相互轉(zhuǎn)換。
總結(jié)
- 上一篇: For input string:
- 下一篇: Oracle 怎么删除重复数据