2013-08-24 2 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; 

} 

어떤 아이디어 : 여기

함수입니까?

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

윈도우 A, W 및 X 빨아 :

답변

1

OSVERSIONINFOEXOSVERSIONINFO보다 더 크므

ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 

는 (주변) osvi "외부"제로를 작성한다.

당신은

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

또는 (종종 안전)

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

나는 이것에 대해 더 동의 할 수 없었다. 문제는 코드를 조금 깔끔하게 만들었고 그의 형제로'OSVERSIONINFOEX'를 바꿨을 때 나타난다. – Nutterz

0

여분의 X가 문제입니다.

방지 매크로 :

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

그래, 그 문제는, 나는 그들이 일치하는 것이라고 생각, 참이었다을 원하지만 EX 하나는 좀 더 많은 정보를 포함하는 것으로 보인다 크기가 맞지 않아서 고마워요. – Nutterz