Ошибка проверки времени выполнения # 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;

}

Есть идеи?

0

Решение

OSVERSIONINFOEX больше чем OSVERSIONINFO, так

    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

будет писать нули «снаружи» (вокруг) osvi,

Ты хочешь

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

или (часто безопаснее)

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

Другие решения

Дополнительная X — это ваша проблема:

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

Окна A, W и X отстой.

Избегать макросов:

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

По вопросам рекламы [email protected]