一. VC常用數(shù)據(jù)類(lèi)型列表
二. 常用數(shù)據(jù)類(lèi)型轉(zhuǎn)化
2.1數(shù)學(xué)類(lèi)型變量與字符串相互轉(zhuǎn)換
2.2 CString及string,char *與其他數(shù)據(jù)類(lèi)型的轉(zhuǎn)換和操作
●CString,string,char*的綜合比較
●數(shù)學(xué)類(lèi)型與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)及操作詳解
參考書(shū)籍:CSDN,<<MFC深入淺出(Second Edit)>>
一.VC常用數(shù)據(jù)類(lèi)型列表
Type
Default Size
Description
基
礎(chǔ)
類(lèi)
型
全
是
小
寫(xiě)
說(shuō)明:這些基礎(chǔ)數(shù)據(jù)類(lèi)型對(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
指向未知類(lèi)型的指針
wchar_t
unsigned 16 bit
16位字符,比char可容納更多的字符
Win32
API
常
用
數(shù)
據(jù)
類(lèi)
型
全
大
寫(xiě)
說(shuō)明: 這些Win32API支持的簡(jiǎn)單數(shù)據(jù)類(lèi)型主要是用來(lái)定義函數(shù)返回值,消息參數(shù),結(jié)構(gòu)成員。這類(lèi)數(shù)據(jù)類(lèi)型大致可以分為五大類(lèi):字符型、布爾型、整型、指針型和句柄型(?). 總共大概有100多種不同的類(lèi)型,
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)字符類(lèi)型
COLORREF
32 bit
RGB顏色值 整型
DWORD
unsigned 32 bit
整型
FLOAT
float型
float型
HANDLE
Object句柄
HBITMAP
bitmap句柄
HBRUSH
brush句柄
HCURSOR
cursor句柄
HDC
設(shè)備上下文句柄
HFILE
OpenFile打開(kāi)的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)字符串類(lèi)型指針
LPCWSTR/LPWSTR/PCWSTR
指向16位Unicode字符串類(lèi)型
LPCTSTR/LPTSTR/PCTSTR
指向一8位或16位字符串類(lèi)型指針
LPVOID
指向一個(gè)未指定類(lèi)型的32位指針
LPDWORD
指向一個(gè)DWORD型指針
其他相似類(lèi)型: 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)類(lèi)型
TBYTE
WCHAR型或者CHAR型
TCHAR
ANSI與unicode均可
VARIANT
_variant_t
COleVariant
一個(gè)結(jié)構(gòu)體參考OAIDL.H
_variant_t是VARIANT的封裝類(lèi)
COleVariant也是VARIANT的封裝類(lèi)
WNDPROC
指向一個(gè)窗口過(guò)程的32位指針
WCHAR
16位Unicode字符型
WORD
16位無(wú)符號(hào)整型
WPARAM
消息參數(shù)
MFC
獨(dú)有
數(shù)據(jù)
類(lèi)型
下面兩個(gè)數(shù)據(jù)類(lèi)型是微軟基礎(chǔ)類(lèi)庫(kù)中獨(dú)有的數(shù)據(jù)類(lèi)型
POSITION
標(biāo)記集合中一個(gè)元素的位置的值,被MFC中的集合類(lèi)所使用
LPCRECT
指向一個(gè)RECT結(jié)構(gòu)體常量(不能修改)的32位指針
CString
其實(shí)是MFC中的一個(gè)類(lèi)
說(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ù)類(lèi)型轉(zhuǎn)化及操作
2.1 數(shù)學(xué)類(lèi)型變量與字符串相互轉(zhuǎn)換(這些函數(shù)都在STDLIB.H里)
(1)將數(shù)學(xué)類(lèi)型轉(zhuǎn)換為字符串可以用以下一些函數(shù):
舉例: _CRTIMP char * __cdecl _itoa(int, char *, int);//這是一個(gè)將數(shù)字轉(zhuǎn)換為一個(gè)字符串類(lèi)型的函數(shù),最后一個(gè)int表示轉(zhuǎn)換的進(jìn)制
如以下程序:
int iTyep=3;
char *szChar;
itoa(iType,szChar,2);
cout<<szChar;//輸出為1010
類(lèi)似函數(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)字符串類(lèi)型
_CRTIMP wchar_t * __cdecl _ltow (long, wchar_t *, int);
_CRTIMP wchar_t * __cdecl _ultow (unsigned long, wchar_t *, int);
還有很多,請(qǐng)自行研究
(2)將字符串類(lèi)型轉(zhuǎn)換為數(shù)學(xué)類(lèi)型變量可以用以下一些函數(shù):
舉例: _CRTIMP int __cdecl atoi(const char *);//參數(shù)一看就很明了
char *szChar=”88”;
int temp(0);
temp=atoi(szChar);
cout<<temp;
類(lèi)似的函數(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)字符串類(lèi)型轉(zhuǎn)換為數(shù)學(xué)類(lèi)型
_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ù)類(lèi)型的轉(zhuǎn)換和操作
(1)CString,string,char*的綜合比較(這部分CSDN上的作者
joise的文章
<< CString,string,char*的綜合比較>>寫(xiě)的很詳細(xì),請(qǐng)大家在仔細(xì)閱讀他的文章.
地址:
http://blog.csdn.net/joise/或參考附錄:
(2)轉(zhuǎn)換:
●數(shù)學(xué)類(lèi)型與CString相互轉(zhuǎn)化
數(shù)學(xué)類(lèi)型轉(zhuǎn)化為CString
可用Format函數(shù),舉例:
CString s;
int i = 64;
s.Format("%d", i)
CString轉(zhuǎn)換為數(shù)學(xué)類(lèi)型:舉例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 類(lèi)型.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)單地寫(xiě)成:
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 類(lèi)型經(jīng)常用來(lái)給 COM 對(duì)象傳遞參數(shù),或者接收從 COM 對(duì)象返回的值。你也能自己編寫(xiě)返回 VARIANT 類(lèi)型的方法,函數(shù)返回什么類(lèi)型依賴(lài)可能(并且常常)方法的輸入?yún)?shù)(比如,在自動(dòng)化操作中,依賴(lài)與你調(diào)用哪個(gè)方法。IDispatch::Invoke 可能返回(通過(guò)其一個(gè)參數(shù))一個(gè) 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 類(lèi)型的結(jié)果,(詳見(jiàn) MSDN 上的 VARIANT 結(jié)構(gòu)的定義)。在下面的例子中,假設(shè)類(lèi)型是一個(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ì)滿(mǎn)意的)。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;
... 剩下的類(lèi)型轉(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ù)類(lèi)型,再對(duì)聯(lián)合結(jié)構(gòu)中相同數(shù)據(jù)類(lèi)型的變量賦值,舉個(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的封裝類(lèi),其賦值可以使用強(qiáng)制類(lèi)型轉(zhuǎn)換,其構(gòu)造函數(shù)會(huì)自動(dòng)處理這些數(shù)據(jù)類(lèi)型。
例如:
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;