SystemParametersInfo調用失敗的問題

從 PUDN 上下載了讀取 EXCEL 文件的程序,剛開始編譯不通過,主要是因爲循環變量定義位置的問題,好解決!

 

但編譯通過後,運行程序即出現錯誤:

ExcelAccess.exe 中的 0x1026ed6a (msvcr90d.dll) 處未處理的異常: 0xC0000005: 讀取位置 0x00000000 時發生訪問衝突

出錯的代碼如下:

  1. LPLOGFONT CPPToolTip::GetSystemToolTipFont() const  
  2. {  
  3.     static LOGFONT LogFont;  
  4.     NONCLIENTMETRICS ncm;  
  5.     ZeroMemory(&ncm,sizeof(NONCLIENTMETRICS));  
  6.     ncm.cbSize = sizeof(NONCLIENTMETRICS);  
  7.     if (0 == SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0))  
  8.     {  
  9.         TRACE("Error of SystemParametersInfo is %d/r/n",GetLastError());  
  10.         return FALSE;  
  11.     }  
  12.     memcpy(&LogFont, &(ncm.lfStatusFont), sizeof(LOGFONT));  
  13.     return &LogFont;   
  14. }  
SystemParametersInfo()函數運行失敗,返回零;GetLastError()同樣也返回零。


修改方法:

ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(ncm.iPaddedBorderWidth);


原因:


由於從 Vista 和 Windows Server 2008 開始,NONCLIENTMETRICS 在最後增加了 iPaddedBorderWidth 字段。

如果程序打算同時支持 vista 和 XP,Windows 2000, Windows Server 2003,那麼應該先調用 GetVersionEx() 檢測Windows版本,然後決定是否需要減去 sizeof (ncms.iPaddedBorderWidth) 。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章