windows - Hvad sker der, hvis SetConsoleMode () ikke understøtter ENABLE\_VIRTUAL\_TERMINAL\_PROCESSING?

Indlæg af Hanne Mølgaard Plasc

Problem




  1. Hvad sker der, hvis SetConsoleMode(handle, ENABLE\_VIRTUAL\_TERMINAL\_PROCESSING) påberåbes i en Windows-version, der ikke understøtter tilstanden (dvs. før version 10.0.14393)?

  2. Hvordan skelner vi mellem Windows, der ikke understøtter ENABLE\_VIRTUAL\_TERMINAL\_PROCESSING i modsætning til den tilstand, der understøttes, men SetConsoleMode() fejler af en anden grund?


Bedste reference


Besvare mit eget spørgsmål:


Da specifikationen ikke giver et konkret svar, er vi tvunget til at bruge Windows-versionen til at træffe en beslutning:


/**
 * @param majorVersion a major version number
 * @param minorVersion a minor version number
 * @param buildVersion a build version number
 * @return true if the Windows version is greater than or equal to the specified number
 */
bool isWindowsVersionOrGreater(WORD majorVersion, WORD minorVersion, WORD buildVersion)
{
    // See http://stackoverflow.com/a/36545162/14731 and https://github.com/DarthTon/Blackbone/blob/master/contrib/VersionHelpers.h#L78
    RTL\_OSVERSIONINFOW verInfo = { 0 };
    verInfo.dwOSVersionInfoSize = sizeof(verInfo);

    static auto RtlGetVersion = (RtlGetVersionPtr) GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlGetVersion");

    if (RtlGetVersion != 0 && RtlGetVersion(&verInfo) == 0)
    {
        if (verInfo.dwMajorVersion > majorVersion)
            return true;
        else if (verInfo.dwMajorVersion < majorVersion)
            return false;

        if (verInfo.dwMinorVersion > minorVersion)
            return true;
        else if (verInfo.dwMinorVersion < minorVersion)
            return false;

        if (verInfo.dwBuildNumber >= buildVersion)
            return true;
    }
    return false;
}


Hvis Windows-versionen er lig med eller større end 10.0.14393, understøttes ENABLE\_VIRTUAL\_TERMINAL\_PROCESSING.