分类: WINDOWS
2010-08-02 15:19:28
为什么要这样定义呢,经“考证后”得到结论:
#if WINVER>=0x0500
...
#define SM_MOUSEWHEELPRESENT ... //打个比方
...
#endif
所以如果没有定义WINVER或者WINVER<0x0500
#if WINVER>=0x0500
...
#endif
之间的代码就没有编译,也就是说这时编译器就看不到这些代码
所以要定义#define WINVER 0x0500
看了这个稍微明白了点了
编辑器是VC++6.0
建立 Win32 Application
在编译时出现如下错误:
--------------------Configuration: sysmets1 - Win32 Debug--------------------
Compiling...
sysmets1.c
e:"test"sysmets1"sysmets.h(297) : error C2065: 'SM_MOUSEWHEELPRESENT' : undeclared identifier
e:"test"sysmets1"sysmets.h(297) : error C2099: initializer is not a constant
e:"test"sysmets1"sysmets.h(297) : warning C4047: 'initializing' : 'int ' differs in levels of indirection from 'char [21]'
e:"test"sysmets1"sysmets.h(301) : error C2065: 'SM_XVIRTUALSCREEN' : undeclared identifier
e:"test"sysmets1"sysmets.h(301) : error C2099: initializer is not a constant
e:"test"sysmets1"sysmets.h(303) : warning C4047: 'initializing' : 'int ' differs in levels of indirection from 'char [24]'
e:"test"sysmets1"sysmets.h(305) : error C2065: 'SM_YVIRTUALSCREEN' : undeclared identifier
e:"test"sysmets1"sysmets.h(305) : error C2099: initializer is not a constant
e:"test"sysmets1"sysmets.h(309) : error C2065: 'SM_CXVIRTUALSCREEN' : undeclared identifier
e:"test"sysmets1"sysmets.h(309) : error C2099: initializer is not a constant
e:"test"sysmets1"sysmets.h(309) : warning C4047: 'initializing' : 'int ' differs in levels of indirection from 'char [19]'
e:"test"sysmets1"sysmets.h(313) : error C2065: 'SM_CYVIRTUALSCREEN' : undeclared identifier
e:"test"sysmets1"sysmets.h(313) : error C2099: initializer is not a constant
e:"test"sysmets1"sysmets.h(315) : warning C4047: 'initializing' : 'int ' differs in levels of indirection from 'char [22]'
e:"test"sysmets1"sysmets.h(317) : error C2065: 'SM_CMONITORS' : undeclared identifier
e:"test"sysmets1"sysmets.h(317) : error C2099: initializer is not a constant
e:"test"sysmets1"sysmets.h(321) : error C2065: 'SM_SAMEDISPLAYFORMAT' : undeclared identifier
e:"test"sysmets1"sysmets.h(321) : error C2099: initializer is not a constant
e:"test"sysmets1"sysmets.h(321) : warning C4047: 'initializing' : 'int ' differs in levels of indirection from 'char [21]'
Error executing cl.exe.
sysmets1.obj - 14 error(s), 5 warning(s)
解决方法:
那些是WindowNT里才能使用的常量,它是是被条件编译的。
需要在的sysmets.cpp文件的最前面加一句
#define WINVER 0x0500
Minimum System Required Macros to Define
Windows 95 and
Windows NT 4.0 WINVER=0x0400
Windows 98 and
Windows NT 4.0 _WIN32_WINDOWS=0x0410 and WINVER=0x0400
Windows NT 4.0 _WIN32_WINNT=0x0400 and WINVER=0x0400
Windows 98 _WIN32_WINDOWS=0x0410
Windows 2000 _WIN32_WINNT=0x0500 and WINVER=0x0500
Windows Me _WIN32_WINDOWS=0x049