2013-08-24 57 views
0

我一直在搜索互聯網,我不知道爲什麼發生這種情況,這不是一個明顯的數組問題。運行時檢查失敗#2 - 變量'osvi'周圍的堆棧在mfc應用程序中被破壞

這裏的功能:

BOOL IsOsCompatible() 
{ 
    BOOL retVal = 0; 
    OSVERSIONINFO osvi; 
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 
    GetVersionEx(&osvi); 
    if(osvi.dwMajorVersion == 6) 
    { 
     if(osvi.dwMinorVersion == 0) 
     { 
      if(SendErrorM("This program has not been tested on Windows Vista(TM).\nAre you sure you want to use it?",MB_YESNO) == IDYES) 
       retVal = 1; 
     } 
     else if(osvi.dwMinorVersion == 1) 
     { 
      retVal = 1; 
     } 
     else if(osvi.dwMinorVersion == 2) 
     { 
      if(SendErrorM("This program has not been tested on Windows 8(TM).\nAre you sure you want to use it?",MB_YESNO) == IDYES) 
       retVal = 1; 
     } 
    } 
    else 
     SendErrorM("Your windows verison is incompatible with the minimum requirements of this application.",NULL); 

    return retVal; 

} 

任何想法?

回答

1

一個OSVERSIONINFOEX是除OSVERSIONINFO大,因此

ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 

將寫 「外側」(約)osvi零。

你想

OSVERSIONINFOEX osvi; 
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 

或(通常更安全)

OSVERSIONINFOEX osvi; 
ZeroMemory(&osvi, sizeof(osvi)); 
+0

我完全同意這一點,當我試圖清理代碼並將'OSVERSIONINFOEX'改爲他的小弟弟時出現問題...... – Nutterz

0

額外的X是你的問題:

OSVERSIONINFO osvi; 
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 

的Windows A,W和X吸。

避免宏

template <typename T> 
inline void zero_memory(T& m) { 
    std::memset(&T, 0, sizeof(T)); 
} 
+0

是的,這是問題的確,我認爲他們會匹配,但似乎EX一個包括一些更多的信息導致尺寸不匹配,非常感謝。 – Nutterz

相關問題