标题: VC6中使用高版本API的方法
作者: Demon
链接: https://demon.tw/programming/vc6-advance-api.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
今天用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
赞赏微信赞赏支付宝赞赏
随机文章: