Windows Vista と Windows 7 の互換性モード
今日ひとつわかったことがあるので、ここに覚書。
Windows Vista と Windows 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 互換モードで起動しなおしているということもわかった。