C/C++教程

VC的数据类型汇总及定义(二)

本文主要是介绍VC的数据类型汇总及定义(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

SC_HANDLE

服务控制管理器数据库的句柄,定义在WinSvc.h文件,定义为:typedef HANDLE SC_HANDLE;

SC_LOCK

服务控制管理器数据库的锁,定义在WinSvc.h文件,定义为:typedef LPVOID SC_LOCK;

SERVICE_STATUS_HANDLE

服务状态值的句柄,定义在WinSvc.h文件,定义为:typedef HANDLE SERVICE_STATUS_HANDLE;

SHORT

短整(16位),定义在WinNT.h文件,定义为:typedef short SHORT;

SIZE_T

能指向最大字节数的指针(32位或者64位),定义在BaseTsd.h文件,定义为:typedef ULONG_PTR SIZE_T;

SSIZE_T

带符号的SIZE_T,定义在BaseTsd.h文件,定义为:typedef LONG_PTR SSIZE_T;

TBYTE

宽字符或者单字节字符,定义在WinNT.h文件。

定义参考如下:

#ifdef UNICODE

  typedef WCHAR TBYTE;

#else

  typedef unsigned char TBYTE;

#endif

TCHAR

宽字符或者单字节字符,定义在WinNT.h文件。

定义参考如下:

#ifdef UNICODE

 typedef WCHAR TCHAR;

#else

 typedef char TCHAR;

#endif

UCHAR

无符号字符,定义在WinDef.h文件,定义为:typedef unsigned char UCHAR;

UHALF_PTR

无符号的半指针,在包含一个指针和两个小字段的结构中使用,定义在Basetsd.h文件。

定义参考如下:

#ifdef _WIN64

  typedef unsigned int UHALF_PTR;

#else

  typedef unsigned short UHALF_PTR;

#endif

UINT

无符号整数(32位),定义在WinDef.h文件,定义为:typedef unsigned int UINT;

UINT_PTR

平台特定的无符号整数类型(32位、64位),在将指针转换为长指针时使用,以执行指针运算。

定义在BaseTsd.h文件。

定义参考如下:

#if defined(_WIN64)

  typedef unsigned __int64 UINT_PTR;

#else

  typedef unsigned int UINT_PTR;

#endif

UINT32

无符号整数(32位),定义在BaseTsd.h文件,定义为:typedef unsigned int UINT32;

UINT64

无符号整数(64位),定义在BaseTsd.h文件,定义为:typedef usigned __int 64 UINT64;

ULONG

无符号整数(32位),定义在WinDef.h文件,定义为:typedef unsigned long ULONG;

ULONGLONG

无符号整数(64位),定义WinNT.h文件。

定义参考如下:

#if !defined(_M_IX86)

  typedef unsigned __int64 ULONGLONG;

#else

  typedef double ULONGLONG;

#endif

ULONG_PTR

平台特定的无符号整数类型(32位、64位),在将指针转换为长指针时使用,以执行指针运算。

定义在BaseTsd.h文件。

定义参考如下:

#if defined(_WIN64)

  typedef unsigned __int64 ULONG_PTR;

#else

  typedef unsigned long ULONG_PTR;

#endif

ULONG32

无符号整数(32位),定义在BaseTsd.h文件,定义为:typedef unsigned int ULONG32;

ULONG64

无符号整数(64位),定义在BaseTsd.h文件,定义为:typedef unsigned __int64 ULONG64;

UNICODE_STRING

Unicode字符串,定义在Winternl.h文件。

定义参考如下:

typedef struct _UNICODE_STRING {

  USHORT  Length;

  USHORT  MaximumLength;

  PWSTR  Buffer;

} UNICODE_STRING;

typedef UNICODE_STRING *PUNICODE_STRING;

typedef const UNICODE_STRING *PCUNICODE_STRING;

USHORT

无符号短整(16位),定义在WinDef.h文件,定义为:typedef unsigned short USHORT;

USN

更新序列号,是Update sequence number的缩写,定义在WinNT.h文件,定义为:typedef LONGLONG USN;

VOID

任意类型,定义在WinNT.h文件,定义为:#define VOID void

WCHAR

宽字符(16位),定义在WinNT.h文件,定义为:typedef wchar_t WCHAR;

WINAPI

系统函数的调用协议,__stdcall为标准调用协议,定义在WinDef.h文件,定义为:#define WINAPI __stdcall

WORD

无符号整数(16位),定义在WinDef.h文件,定义为:typedef unsigned short WORD;

WPARAM

消息函数的参数,定义在WinDef.h文件,定义为:typedef UINT_PTR WPARAM;

API数据类型较复杂,可以归类来理解。它们可分为以下类别:

1、字符(串)类

如CHAR、WCHAR、LPSTR、LPCSTR

2、数值类

BYTE、SHORT、INT、UINT、DWORD、LPINT、LPBYTE

3、句柄类

HANDLE、HDC、HBITMAP、HBRUSH、HCURSOR、HHOOK

4、空类

VOID、LPVOID、PVOID

5、其它类

ATOM、LRESULT、COLORREF、LANGID、PHKEY

 

三、COM数据类型

COM(Component Object Model,组件对象模型)的目的就是希望组件被其它各种语言编写的程序调用,甚至是跨平台的程序。COM必须考虑跨平台的问题,对于字符,就要使用16位的数据类型。

COM的数据类,常见的有以下几种:

<一>、BSTR、_bstr_t与CComBSTR

1、几种类型的来龙去脉

(1)、BSTR的产生

COM开发过程中,直接使用单字节字符串char*,在 COM 组件间传递不太方便。因为跨平台的问题,就要使用16位的宽字符。为此,新的数据类型BSTR因此而产生。

标准 BSTR 是一个有长度前缀和 null 结束符的 OLECHAR 数组。 BSTR 的前 4 字节是一个表示字符串长度的前缀。 BSTR 长度域的值是字符串的字节数,但不包括结束符。由于是 Unicode 串,所以字符数是字节数的一半。

这种方式的优点是允许程序员在 BSTR 串中间嵌入 NULL 字符。但是, BSTR 的前四个字节表示长度,而 OLECHAR 数组的前四字节表示前两个字符。这种情况下,对于 C++ 程序,如何实现 BSTR 和 OLECHAR 的交换?答案是 COM 提供了两个 BSTR 分配用的 API函数 : SysAllocString()和SysReallocString() 。函数返回的指针指向 BSTR 的第一个字符,而不是 BSTR 在内存的第一个字节。

在 COM 中,字符用 16位OLECHAR 表示,这样使 COM 可以支持各种 代码页 ,包括 Unicode 。对于 windows 系统,可以简单理解为 OLECHAR 使用的就是Unicode。 OLECHAR 串与单字节字符串很类似,是一个以 null 结尾的 buffer。

(2)、_bstr_t的产生

从BSTR的定义可知,BSTR仅仅是一个OLECHAR *(WCHAR *)指针,没有引用计数。

这个对象什么时候应该被释放呢,COM里对一个对象的引用计数为0的时候,会自动被释放。指针指向一个有可能已经被释放的地址,是不恰当的。而_bstr_t弥补这一点。

_bstr_t是一个类似于智能指针的包装类,因此当变量被破坏或超出范围时,它将释放分配的内存。

_bstr_t还有引用计数,每次通过值(避免不必要的副本)传递_bstr_t变量时,它都会增加,并且在不再使用时会递减。每当所有引用被销毁时,字符串的分配内存将被释放。由于_bstr_t对象会增加引用计数,它的该释放就合理了。

(3)、CComBSTR的产生

同_bstr_t 一样,CComBSTR也是对BSTR的封装,也使用了智能指针。

一般情况之下,CComBSTR专应用在ATL应用中,而_bstr_t则多用于非ATL应用中。

 

2、它们的定义

(1)、BSTR的定义

参考C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\wtypes.h中BSTR的定义:

typedef OLECHAR __RPC_FAR *BSTR;

typedef WCHAR OLECHAR;

typedef wchar_t WCHAR;

再参考C:\Program Files\Microsoft SDKs\Windows\v5.0\Include\Basetyps.h 中wchar_t的定义:

typedef unsigned short wchar_t;

 

(2)、_bstr_t的定义

参考文章:<a href="http://www.it001.xyz/?vcarticle-146.html">VC中BSTR、bstr_t、CComBSTR的定义</a>

(3)、CComBSTR的定义

参考文章:<a href="http://www.it001.xyz/?vcarticle-146.html">VC中BSTR、bstr_t、CComBSTR的定义</a>

 

3、它们的用法

参考文章:<a href="http://www.it001.xyz/?vcarticle-149.html">VC数据类型的转换</a>

 

<二>、VARIANT、_variant_t 与 COleVariant

1、几种类型的来龙去脉

VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。

    VARIANT变量的赋值很麻烦,必须指明类型,类型是复杂的。而_variant_t则弥补了这一点。

    _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。

    当MFC出现后,为了自己也有一个通用数据类型的类,COleVariant也就产生了。它的使用与_variant_t的方法基本一样。

 

2、它们的定义

(1)、VARIANT的定义

参考文章:<a href="http://www.it001.xyz/?vcarticle-147.html">VC中VARIANT、_variant_t、COleVariant的定义</a>

 

(2)、_variant_t的定义

参考文章:<a href="http://www.it001.xyz/?vcarticle-147.html">VC中VARIANT、_variant_t、COleVariant的定义</a>

 

(3)、COleVariant的定义

参考文章:<a href="http://www.it001.xyz/?vcarticle-147.html">VC中VARIANT、_variant_t、COleVariant的定义</a>

 

3、VARIANT特有数据类型与基本数据类型的对应关系

为了方便使用VARIANT,以下总结了数据成员与数据类型的对应关系。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

数据成员

VARIANT特有类型

等效类型

llVal

VT_I8

LONGLONG

lVal

VT_I4

LONG

bVal

VT_UI1

BYTE

iVal

VT_I2

SHORT

fltVal

VT_R4

FLOAT

dblVal

VT_R8

DOUBLE

boolVal

VT_BYREF|VT_BOOL

VARIANT_BOOL

Bool

VT_BOOL

_VARIANT_BOOL

Scode

VT_ERROR

SCODE

cyVal

VT_CY

CY

Date

VT_DATE

DATE

bstrVal

VT_BSTR

BSTR

*punkVal

VT_UNKNOWN

IUnknown

*pdispVal

VT_DISPATCH

IDispatch

*parray

VT_ARRAY

SAFEARRAY

*pbVal

VT_BYREF|VT_UI1

BYTE

*piVal

VT_BYREF|VT_I2

SHORT

*plVal

VT_BYREF|VT_I4

LONG

*pllVal

VT_BYREF|VT_I8

LONGLONG

*pfltVal

VT_BYREF|VT_R4

FLOAT

*pdblVal

VT_BYREF|VT_R8

DOUBLE

*pboolVal

VT_BYREF|VT_BOOL

VARIANT_BOOL

*pbool

VT_BYREF|VT_BOOL

_VARIANT_BOOL

*pscode

VT_BYREF|VT_ERROR

SCODE

*pcyVal

VT_BYREF|VT_CY

CY

*pdate

VT_BYREF|VT_DATE

DATE

*pbstrVal

VT_BYREF|VT_BSTR

BSTR

**ppunkVal

VT_BYREF|VT_UNKNOWN

IUnknown

**ppdispVal

VT_BYREF|VT_DISPATCH

IDispatch

**pparray

VT_BYREF|VT_ARRAY

SAFEARRAY

*pvarVal

VT_BYREF|VT_VARIANT

VARIANT

Byref

VT_BYREF

PVOID

cVal

VT_I1

CHAR

uiVal

VT_UI2

USHORT

ulVal

VT_UI4

ULONG

ullVal

VT_UI8

ULONGLONG

intVal

VT_INT

INT

uintVal

VT_UINT

UINT

*pdecVal

VT_BYREF|VT_DECIMAL

DECIMAL

*pcVal

VT_BYREF|VT_I1

CHAR

*puiVal

VT_BYREF|VT_UI2

USHORT

*pulVal

VT_BYREF|VT_UI4

ULONG

*pullVal

VT_BYREF|VT_UI8

ULONGLONG

*pintVal

VT_BYREF|VT_INT

INT

*puintVal

VT_BYREF|VT_UINT

UINT

 

 

4、它们的用法

参考文章:<a href="http://www.it001.xyz/?vcarticle-149.html">VC数据类型的转换</a>

 

四、有些函数返回值的协议类型

    这些协议如CALLBACK、WINAPI、PASCAL,它们的定义缺省路径如下:

C:\Program Files\Microsoft SDKs\Windows\v5.0\Include\WinDef.h。

#ifdef _MAC

#define CALLBACK  PASCAL

#define WINAPI      CDECL

#define WINAPIV     CDECL

#define APIENTRY    WINAPI

#define APIPRIVATE  CDECL

#ifdef _68K_

#define PASCAL      __pascal

#else

#define PASCAL

#endif

#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)

#define CALLBACK   __stdcall

#define WINAPI       __stdcall

#define WINAPIV     __cdecl

#define APIENTRY    WINAPI

#define APIPRIVATE   __stdcall

#define PASCAL       __stdcall

#else

#define CALLBACK

#define WINAPI

#define WINAPIV

#define APIENTRY     WINAPI

#define APIPRIVATE

#define PASCAL       pascal

#endif

 

如API函数WinExec()就带有一个WINAPI协议:

UINT WINAPI WinExec(

  __in          LPCSTR lpCmdLine,

  __in          UINT uCmdShow

);

 

五、回调函数指针类

缺省位置为C:\Program Files\Microsoft SDKs\Windows\v5.0\Include\WinUser.h,还有WinGDI.h等。

MFENUMPROC 该回调函数枚举元文件记录

ENUMFENUMPROC 该回调函数枚举增强的元文件记录

ENUMRESLANGPROC 该回调函数枚举资源语言

ENUMRESNAMEPROC 该回调函数枚举资源名称

ENUMRESTYPEPROC 该回调函数枚举资源类型

FONTENUMPROC 该回调函数枚举字体

GOBJENUMPROC 该回调函数枚举图形设备接口(GDI)对象

HOOKPROC 钩子过程函数指针

LPCCHOOKPROC 指向一个应用程序定义的钩子函数的指针

LPCFHOOKPROC 指向一个应用程序定义的钩子函数的指针

LPFRHOOKPROC 指向一个应用程序定义的钩子函数的指针

LPOFNHOOKPROC 指向一个应用程序定义的钩子函数的指针

LPPRINTHOOKPROC 指向一个应用程序定义的钩子函数的指针

LPSETUPHOOKPROC 指向一个应用程序定义的钩子函数的指针

FARPROC 指向一个长回调函数的指针

DLGPROC 指向一个对话框过程的指针

LINEDDAPROC 指向一个回调函数的指针,该回调函数处理行坐标

LOHANDLER_FUNCTION 指向一个处理程序函数的指针

PROPENUMPROC 指向一个枚举窗口的回调函数的指针

PFNCALLBACK 指向一个回调函数的指针

PHANDLER_ROUTINE 指向一个处理程序的指针

TIMERPROC 指向一个应用程序定义的定时器回调函数的指针

WNDENUMPROC 指向枚举窗口的回调函数的指针

WNDPROC 指向一个应用程序定义的窗口过程的指针

YIELDPROC 指向一个输出回调函数的指针

 

回调函数基本用法示例如下:

(1)、与钩子应用有关的函数SetWindowsHookEx(),它的声明如下:

HHOOK SetWindowsHookEx( int idHook,

    HOOKPROC lpfn,

    HINSTANCE hMod,

DWORD dwThreadId

);

(2)、第二个参数lpfn,就需要自定义一个HOOKPROC的回调函数,HOOKPROC的定义参考如下:

typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);

(3)、相应地,你需要定义一个形如下面的一个回调函数:

LRESULT CALLBACK mytest (int code, WPARAM wParam, LPARAM lParam)

{

    ……

}

(4)、调用回调函数:

SetWindowsHookEx(WH_KEYBOARD, mytest,hInstance,0);

 

      VC数据类型繁杂,但有些数据类型是等同的;这部分的知识,请参考如下文章:<a href="http://www.it001.xyz/?vcarticle-149.html">VC++数据类型的等效性</a>

这篇关于VC的数据类型汇总及定义(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!