VC++常用數據類型及其操作詳解 - TMD 程序員寧有種乎? - 博客園

一.              VC常用數據類型列表

二.              常用數據類型轉化

2.1數學類型變量與字符串相互轉換

2.2 CString及string,char *與其他數據類型的轉換和操作

●CString,string,char*的綜合比較

●數學類型與CString相互轉化

●CString與char*相互轉換舉例

●CString 與 BSTR 型轉換

●VARIANT 型轉化成 CString 型

2.3 BSTR、_bstr_t與CComBSTR

2.4 VARIANT 、_variant_t 與 COleVariant

附錄CString及字符串轉及操作詳解

 

參考書籍:CSDN,<<MFC深入淺出(Second Edit)>>

 

 

                             一.VC常用數據類型列表

 

 

Type

Default Size

Description

 

 

 

 

 

 

說明:這些基礎數據類型對於MFC還是API都是被支持的

boolean

unsigned 8 bit ,

取值TRUE/FALSE

byte

unsigned 8 bit,

整數,輸出按字符輸出

char

unsigned 8 bit,

字符

double

signed 64 bit

浮點型

float

signed32 bit

浮點型

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

 

說明: 這些Win32API支持的簡單數據類型主要是用來定義函數返回值,消息參數,結構成員。這類數據類型大致可以分爲五大類:字符型、布爾型、整型、指針型和句柄型(?). 總共大概有100多種不同的類型,

BOOL/BOOLEAN

8bit,TRUE/FALSE

布爾型

BYTE

unsigned 8 bit

 

BSTR

CComBSTR

_bstr_t

32 bit

BSTR是指向字符串的32位指針

是對BSTR的封裝

是對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

 

設備上下文句柄

HFILE

 

OpenFile打開的File句柄

HFONT

 

font句柄

HHOOK

 

hook句柄

HKEY

 

註冊表鍵句柄

HPEN

 

pen句柄

HWND

 

window句柄

INT

--------

--------

LONG

--------

---------

LONGLONG

 

64位帶符號整型

LPARAM

32 bit

消息參數

LPBOOL

 

BOOL型指針

LPBYTE

 

BYTE型指針

LPCOLOREF

 

COLORREF型指針

LPCSTR/LPSTR/PCSTR

 

指向8位(ANSI)字符串類型指針

LPCWSTR/LPWSTR/PCWSTR

 

指向16位Unicode字符串類型

LPCTSTR/LPTSTR/PCTSTR

 

指向一8位或16位字符串類型指針

LPVOID

 

指向一個未指定類型的32位指針

LPDWORD

 

指向一個DWORD型指針

其他相似類型: LPHANDLE、LPINT、LPLONG、LPWORD、LPRESULT

PBOOL、PBOOLEAN、PBYTE、PCHAR、PDWORD、PFLOAT、PHANDLE、PINT、PLONG、PSHORT……

說明:(1)在16位系統中 LP爲16bit,P爲8bit,在32位系統中都是32bit(此時等價)

(2)LPCSTR等 中的C指Const,T表示TCHAR模式即可以工作在ANSI下也可UNICODE

SHORT

usigned

整型

其他UCHAR、UINT、ULONG、ULONGLONG、USHORT爲無符號相應類型

TBYTE

 

WCHAR型或者CHAR型

TCHAR

 

ANSI與unicode均可

VARIANT

_variant_t

COleVariant

 

一個結構體參考OAIDL.H

_variant_t是VARIANT的封裝類

COleVariant也是VARIANT的封裝類

 

 

 

 

 

 

WNDPROC

 

指向一個窗口過程的32位指針

WCHAR

 

16位Unicode字符型

WORD

 

16位無符號整型

WPARAM

 

消息參數

MFC

獨有

數據

類型

下面兩個數據類型是微軟基礎類庫中獨有的數據類型

POSITION

標記集合中一個元素的位置的值,被MFC中的集合類所使用

LPCRECT

指向一個RECT結構體常量(不能修改)的32位指針

CString

其實是MFC中的一個類

 

 

 

說明:

(1)-------表示省略

(2)1Byte=8Bit,

字與機器有關,在8位系統中:字=1字節,16位系統中,1字=2字節,32位中:1字=4字節,

64位中1字=8字節.不要搞混這些概念.

 

 

二.常用數據類型轉化及操作

2.1 數學類型變量與字符串相互轉換(這些函數都在STDLIB.H裏)

(1)將數學類型轉換爲字符串可以用以下一些函數:

舉例: _CRTIMP char * __cdecl _itoa(int, char *, int);//這是一個將數字轉換爲一個字符串類型的函數,最後一個int表示轉換的進制

如以下程序:

int iTyep=3;

char *szChar;

itoa(iType,szChar,2);

cout<<szChar;//輸出爲1010

類似函數列表:

_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);//轉換爲長字符串類型

_CRTIMP wchar_t * __cdecl _ltow (long, wchar_t *, int);

_CRTIMP wchar_t * __cdecl _ultow (unsigned long, wchar_t *, int);

還有很多,請自行研究

(2)將字符串類型轉換爲數學類型變量可以用以下一些函數:

舉例: _CRTIMP int  __cdecl atoi(const char *);//參數一看就很明瞭

char *szChar=”88”;

int temp(0);

temp=atoi(szChar);

cout<<temp;

類似的函數列表:

_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 **);//長字符串類型轉換爲數學類型

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

還有很多,請自行研究

2.2.CString及string,char *與其他數據類型的轉換和操作

(1)CString,string,char*的綜合比較(這部分CSDN上的作者joise的文章

<< CString,string,char*的綜合比較>>寫的很詳細,請大家在仔細閱讀他的文章.

地址: http://blog.csdn.net/joise/

或參考附錄:

(2)轉換:

●數學類型與CString相互轉化

 數學類型轉化爲CString

可用Format函數,舉例:

CString s;

int i = 64;

s.Format("%d", i)

CString轉換爲數學類型:舉例CString strValue("1.234");

double dblValue;

dblValue = atof((LPCTSTR)strValue);

●CString與char*相互轉換舉例

CString strValue(“Hello”);

char *szValue;

szValue=strValue.GetBuffer(szValue);

也可用(LPSTR)(LPCTSTR)對CString//  進行強制轉換.  

szValue=(LPSTR)(LPCTSTR)strValue;

反過來可直接賦值:

char *szChar=NULL;

CString strValue;

szChar=new char[10];

memset(szChar,0,10);

strcpy(szChar,”Hello”);

strValue=szChar;

●CString 與 BSTR 型轉換

CString 型轉化成 BSTR 型

當我們使用 ActiveX 控件編程時,經常需要用到將某個值表示成 BSTR 類型.BSTR 是一種記數字符串,Intel平臺上的寬字符串(Unicode),並且可以包含嵌入的 NULL 字符。

可以調用 CString 對象的 AllocSysString 方法將 CString 轉化成 BSTR:

CString str;

str = .....; // whatever

BSTR bStr = str.AllocSysString();

 

BSTR型轉換爲CString

如果你在 UNICODE 模式下編譯代碼,你可以簡單地寫成:

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 型轉化成 CString 型

VARIANT 類型經常用來給 COM 對象傳遞參數,或者接收從 COM 對象返回的值。你也能自己編寫返回 VARIANT 類型的方法,函數返回什麼類型 依賴可能(並且常常)方法的輸入參數(比如,在自動化操作中,依賴與你調用哪個方法。IDispatch::Invoke 可能返回(通過其一個參數)一個 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIANT 類型的結果,(詳見 MSDN 上的 VARIANT 結構的定義)。在下面的例子中,假設 類型是一個BSTR的變體,也就是說在串中的值是通過 bsrtVal 來引用,其優點是在 ANSI 應用中,有一個構造函數會把 LPCWCHAR 引用的值轉換爲一個 CString(見 BSTR-to-CString 部分)。在 Unicode 模式中,將成爲標準的 CString 構造函數,參見對缺省::WideCharToMultiByte 轉換的告誡,以及你覺得是否可以接受(大多數情況下,你會滿意的)。VARIANT vaData;

vaData = m_com.YourMethodHere();

ASSERT(vaData.vt == VT_BSTR);

CString strData(vaData.bstrVal);

你還可以根據 vt 域的不同來建立更通用的轉換例程。爲此你可能會考慮:

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;

       ... 剩下的類型轉換由讀者自己完成

       default:

          ASSERT(FALSE); // unknown VARIANT type (this ASSERT is optional)

          return CString("");

      } /* vt */

}

 

2.3 BSTR、_bstr_t與CComBSTR

CComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字符串的32位指針。

char *轉換到BSTR可以這樣:

BSTR b=_com_util::ConvertStringToBSTR("數據");///使用前需要加上頭文件comutil.h

反之可以使用char *p=_com_util::ConvertBSTRToString(b);

2.4(引)VARIANT 、_variant_t 與 COleVariant

VARIANT的結構可以參考頭文件VC98/Include/OAIDL.H中關於結構體tagVARIANT的定義。

對於VARIANT變量的賦值:首先給vt成員賦值,指明數據類型,再對聯合結構中相同數據類型的變量賦值,舉個例子:

VARIANT va;

int a=2001;

va.vt=VT_I4;///指明整型數據

va.lVal=a; ///賦值

對於不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進行初始化,其本質是將vt設置爲VT_EMPTY,下表我們列舉vt與常用數據的對應關係:

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的封裝類,其賦值可以使用強制類型轉換,其構造函數會自動處理這些數據類型。

例如:

long l=222;

ing i=100;

_variant_t lVal(l);

lVal = (long)i;

COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:

COleVariant v3 = "字符串", v4 = (long)1999;

CString str =(BSTR)v3.pbstrVal;

long i = v4.lVal;

VC++.NET中字符串之間的轉換見原文章 本文轉自 http://www.cnblogs.com/nemolog/archive/2005/11/13/275055.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章