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>