Windows Vista と Windows 7 の互換性モード

今日ひとつわかったことがあるので、ここに覚書。

Windows VistaWindows 7 には、プログラムを実行する際に、互換性モードで実行することが可能なんだけど、その互換性モードで実行されたプログラムが何をしているか、というの(のひとつ)が GetVersion と GetVersionEx で返される値を変えてしまう、というのがある。

/* cl GetVersionExTest.c */
#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
    int ver;
    BOOL rc;
    OSVERSIONINFO osvi;
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    
    rc = GetVersionEx(&osvi);
    
    printf("rc:%s, Major:%d, Minor:%d, PlatformId:%d, %s\n\n",
        rc ? "TRUE" : "FALSE", osvi.dwMajorVersion, 
        osvi.dwMinorVersion, osvi.dwPlatformId,
        osvi.szCSDVersion);
    
    printf("Pless Enter key...");
    getc(stdin);
    return 0;
}

上記プログラムは、Windows 7 だと

rc:TRUE, Major:6, Minor:1, PlatformId:2, Service Pack 1

とか、そういう文字列を出力するんだけど、これを XP 互換で動作させると Major:5, Minor:1 という風に、Win32 API の返す値が変わる。


また、Windows 7インストーラを実行してインストールした後に

「プログラムは正しくインストールされましたか?推奨環境でインストールしなおしますか?」

みたいな質問をされることがあるんだけど、あれはインストーラWindows Vista 互換モードで起動しなおしているということもわかった。