天天看点

【转帖】VC常用数据类型及使用转换详解

VC常用数据类型及使用转换详解

一、常用数据类型列表

VC常用数据类型列表(1)

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可容纳更多的字符

VC常用数据类型列表(2)

Win32

API

说明: 这些Win32API支持的简单数据类型主要是用来定义函数返回值,消息参数,结构成员。这类数据类型大致可以分为五大类:字符型、布尔型、整型、指针型和句柄型(?). 总共大概有100多种不同的类型,
BOOL/BOOLEAN 8bit,TRUE/FALSE 布尔变量,实际上是16位UINT
BYTE unsigned 8 bit  8位无符号整数

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 32位的无符号整数,用作Windows系统所建立的某个对象的句柄,使该句柄就相当于引用该对象。
HBITMAP bitmap句柄
HBRUSH brush句柄
HCURSOR cursor句柄
HDC 设备上下文句柄
HFILE OpenFile打开的File句柄
HFONT font句柄
HHOOK hook句柄
HKEY 注册表键句柄
HPEN pen句柄
HWND 32位的无符号整数,用作窗口句柄,使该句柄就相当于引用该窗口。
HINSTANCE 32位的无符号整数,用作实例句柄

VC常用数据类型列表(3)

INT -------- --------
UINT 定义一个新的Win32数据类型,它会把一个参数强制转换成Windows3.x应用中的16位值或Win32应用中的32位值
LONG -------- 32位带符号整数
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位字符串类型指针
LPSTR 一个32位,指向字符(字符串)数据的指针
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的封装类

FARPROC  指向函数的32位指针
WNDPROC 指向一个窗口过程的32位指针
WCHAR 16位Unicode字符型
WORD 16位无符号整型
LOWORD 取一个32位整数的低16位,并应强制转换为short int。
WPARAM 消息参数
SIZE_T size_t是针对系统定制的一种数据类型,一般是整形,因为C/C++标准只定义一最低的 位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。 一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。具体要查看技术手册。

MFC

独有

数据

类型

下面两个数据类型是微软基础类库中独有的数据类型
POSITION 标记集合中一个元素的位置的值,被MFC中的集合类所使用
LPCRECT 指向一个RECT结构体常量(不能修改)的32位指针
CString 其实是MFC中的一个类

同时,为了统一变量的命名,在Windows中,不同类型的变量拥有各自的标准前缀,一般情况如表所示。

不同数据类型的前缀

前缀 数据类型

c 字符(char)

s 短整数(short)

cb 用于定义对象(一般为一个结构)尺寸的整数

n 整数(integer)

sz 以'/0'结尾的字符串

b 字节

f BOOL

w 字(WORD,无符号短整数)

l 长整数(LONG)

h HANDLE(无符号整数)

m_ 类成员变量

fn 函数(function)

dw 双字(DWORD,无符号长整数)

二、数据类型转换:

刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。

我们先定义一些常见类型变量借以说明

int i = 100;

long l = 2001;

float f=300.2;

double d=12345.119;

char username[]="www.handytech.cn";

char temp[200];

char *buf;

CString str;

_variant_t v1;

_bstr_t v2;

一、其它数据类型转换为字符串

短整型(int)

itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制

itoa(i,temp,2); ///按二进制方式转换

长整型(long)

ltoa(l,temp,10);

二、从其它包含字符串的变量中获取指向该字符串的指针

CString变量

str = "2008北京奥运";

buf = (LPSTR)(LPCTSTR)str;

BSTR类型的_variant_t变量

v1 = (_bstr_t)"程序员";

buf = _com_util::ConvertBSTRToString((_bstr_t)v1);

三、字符串转换为其它数据类型

strcpy(temp,"123");

短整型(int)

i = atoi(temp);

长整型(long)

l = atol(temp);

浮点(double)

d = atof(temp);

四、其它数据类型转换到CString

使用CString的成员函数Format来转换,例如:

整数(int)

str.Format("%d",i);

浮点数(float)

str.Format("%f",i);

字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值

str = username;

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

六、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;

七、其它

对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:

LPARAM lParam;

WORD lovalue = LOWORD(lParam);///取低16位

WORD hivalue = HIWORD(lParam);///取高16位

对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:

WORD wvalue;

BYTE lovalue = LOBYTE(wvalue);///取低8位

BYTE hivalue = HIBYTE(wvalue);///取高8位