VC6中使用高版本API的方法

标签: , ,

今天用VC6重新编译一个以前写过的程序。程序中使用了API函数SetWindowsHookEx,某段代码如下

SetWindowsHookEx(WH_KEYBOARD_LL,KeyHookProc,hInstance,0);

Visual Studio 2008太大了我没有安装,只安装了Visual C++ 6.0和Microsoft Platform SDK February 2003。这个程序以前用VC9(即VC2008)编译没有任何问题,但是今天用VC6编译的时候竟然报错:

error C2065: 'WH_KEYBOARD_LL' : undeclared identifier

MSDN文档上说WH_KEYBOARD_LL要求系统必须至少为Windows NT/2000/XP,我的系统是Windows 2008 R2,怎么还会报错说未定义呢?百思不得其解。

文档说WH_KEYBOARD_LL Declared in Winuser.h,好吧,我就打开Winuser.h看了一下,终于找到了原因:

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL     13
#define WH_MOUSE_LL        14
#endif // (_WIN32_WINNT >= 0x0400)

罪魁祸首就是这个_WIN32_WINNT,只有当它大于0x0400的时候才定义WH_KEYBOARD_LL。

查了一下MSDN文档,_WIN32_WINNT是用来定义操作系统版本的,各个版本操作系统对应的_WIN32_WINNT如下:

Windows 7 0x0601
Windows Server 2008 R2 0x0601
Windows Vista 0x0600
Windows Server 2008 0x0600
Windows Server 2003 with SP1, Windows XP with SP2 0x0502
Windows Server 2003, Windows XP 0x0501
Windows 2000 0x0500

所以,只要在#include <windows.h>之前定义对应的_WIN32_WINNT就不会报错了。

参考链接:Using the Windows Headers

赞赏

微信赞赏支付宝赞赏

随机文章:

  1. Windows下编译cURL
  2. 各浏览器禁止内容选中的方式
  3. VB6拾遗:数组的内部实现
  4. VBS里的变量名和标识符(Identifiers)
  5. IPv6免费传文件——uTorrent鲜为人知的功能

留下回复