0

私はインターネットを検索してきましたが、なぜこれが起こるのかわかりません。これは、明らかなアレイの問題ではありません。

関数は次のとおりです。

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;

}

何か案は?

4

2 に答える 2

1

OSVERSIONINFOEXより大きいOSVERSIONINFOので、

    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

「外側」(周囲)にゼロを書き込みosviます。

あなたがしたい

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

または(多くの場合、より安全)

OSVERSIONINFOEX osvi;
ZeroMemory(&osvi, sizeof(osvi));
于 2013-08-24T17:25:13.287 に答える
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));
}
于 2013-08-24T17:20:06.547 に答える