SystemParametersInfo 关于VERIFY 出错

来源:互联网 发布:炒股看盘软件 编辑:程序博客网 时间:2024/04/29 01:49

xp sp3,vs2008

一个自定义继承与cdialog类,执行下面的代码报错

VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));

原先在vs2003是好的,百度,

这是由于以前的工程迁移到Visual stutio 2008上,而本人所使用的是XP出现的问题。 这是由于Visual studio 2008里面默认的Windows 版本是vista,而自己现在使用的是XP而出现的。

因为在新的 Windows SDK 6.0 中,其定义如下:

typedef struct tagNONCLIENTMETRICSA{    UINT    cbSize;    int     iBorderWidth;    int     iScrollWidth;    int     iScrollHeight;    int     iCaptionWidth;    int     iCaptionHeight;    LOGFONTA lfCaptionFont;    int     iSmCaptionWidth;    int     iSmCaptionHeight;    LOGFONTA lfSmCaptionFont;    int     iMenuWidth;    int     iMenuHeight;    LOGFONTA lfMenuFont;    LOGFONTA lfStatusFont;    LOGFONTA lfMessageFont;#if(WINVER >= 0x0600)    int     iPaddedBorderWidth;#endif /* WINVER >= 0x0600 */}

解决办法:

(一)如果你想用nm.cbSize = sizeof (NONCLIENTMETRICS) ; 这个是低版本,通常所说的0x0501,就在stdafx.h中

#pragma once

#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif

这个语句的后面加上以下2句

#ifndef WINVER    // 允许使用特定于 Windows XP 或更高版本的功能。
#define WINVER 0x0501  // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif

#ifndef _WIN32_WINNT  // 允许使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif 

(二)同时支持 vista 或 XP ,Windows 2000, Windows Server 2003,那么应该先调用 GetVersionEx 检测Windows版本,然后决定是否需要减去 sizeof (ncms.iPaddedBorderWidth)


OSVERSIONINFOEX osvi;memset(&osvi, 0, sizeof(OSVERSIONINFOEX));osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);if( !(GetVersionEx ((OSVERSIONINFO *) &osvi)) ){    osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);    if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )         return;}NONCLIENTMETRICS ncm;if(osvi.dwMajorVersion <= 5 /*&& && osvi.dwMinorVersion == 1*/)//5000:2000,5001:xp,5002:win2003    ncm.cbSize = sizeof(NONCLIENTMETRICS)- sizeof(ncm.iPaddedBorderWidth);else    ncm.cbSize = sizeof(NONCLIENTMETRICS);VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));

参考:http://hi.baidu.com/vc_net/item/b8c5f761f70b9290c4d2494b

原创粉丝点击