SystemParametersInfo 错误及解决方法

将编译环境从VC6迁移至VS2008,运行系统为Windows XP时调用以下代码:

  1. // Retrieves the message font info
  2. NONCLIENTMETRICS ncm;
  3. ncm.cbSize = sizeof(NONCLIENTMETRICS);
  4. SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);

得到的结果为空。

 

原因分析:

 

用VS2008新建项目时,默认会在StdAfx.h文件中定义:

  1. #ifndef WINVER                  // 指定要求的最低平台是 Windows Vista。
  2. #define WINVER 0x0600           // 将此值更改为相应的值,以适用于 Windows 的其他版本。
  3. #endif
  4. #ifndef _WIN32_WINNT            // 指定要求的最低平台是 Windows Vista。
  5. #define _WIN32_WINNT 0x0600     // 将此值更改为相应的值,以适用于 Windows 的其他版本。
  6. #endif

然后我们再看一下NONCLIENTMETRICS 这个结构体的定义:

  1. typedef struct tagNONCLIENTMETRICSA
  2. {
  3.     UINT    cbSize;
  4.     int     iBorderWidth;
  5.     int     iScrollWidth;
  6.     int     iScrollHeight;
  7.     int     iCaptionWidth;
  8.     int     iCaptionHeight;
  9.     LOGFONTA lfCaptionFont;
  10.     int     iSmCaptionWidth;
  11.     int     iSmCaptionHeight;
  12.     LOGFONTA lfSmCaptionFont;
  13.     int     iMenuWidth;
  14.     int     iMenuHeight;
  15.     LOGFONTA lfMenuFont;
  16.     LOGFONTA lfStatusFont;
  17.     LOGFONTA lfMessageFont;
  18. #if(WINVER >= 0x0600)
  19.     int     iPaddedBorderWidth;
  20. #endif /* WINVER >= 0x0600 */
  21. }
  22. #ifdef UNICODE
  23. #define NONCLIENTMETRICSW NONCLIENTMETRICS
  24. #else
  25. #define NONCLIENTMETRICSA NONCLIENTMETRICS
  26. #endif

注意最后的:

  1. #if(WINVER >= 0x0600) 
  2.     int     iPaddedBorderWidth;
  3. #endif /* WINVER >= 0x0600 */ 

这是新的系统新加的,在Windows XP 下这个参数是没有用的,但是我们的在StdAfx.h定义了我们的最低平台是Vista所以会出错。

 

解决方法:

        一、修改我们的代码,将最后分配的字节大小减掉。

  1. // Retrieves the message font info 
  2. NONCLIENTMETRICS ncm;
  3. ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(ncm.iPaddedBorderWidth);
  4. SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);

       二、修改中的宏为:

  1. #define WINVER 0x0500
  2. #define _WIN32_WINNT 0x0500

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(windows,XP,平台)