В моей системе Windows 7 Windows API function GetVersionEx возвращается "6.0", указывая на Windows Vista, когда это должно возвратиться "6.1".
Если это имеет значение, я использовал следующий код Delphi:
function winver: string;
var
ver: TOSVersionInfo;
begin
ver.dwOSVersionInfoSize := SizeOf(ver);
if GetVersionEx(ver) then
with ver do
result := IntToStr(dwMajorVersion) + '.' + IntToStr(dwMinorVersion) + '.' + IntToStr(dwBuildNumber) + ' (' + szCSDVersion + ')';
end;
и строка "6.0.6002 (Пакет обновления 2)" была возвращена.
Разве это не очень нечетно?
Теперь я обнаружил, что GetVersionEx возвращает Vista, когда мое приложение запускается через отладчик Delphi 2009, но Windows 7, когда приложение выполняется самостоятельно. Я также обнаружил, что RAD Studio (IDE Delphi) действительно работает в режиме совместимости для Windows Vista SP2. Следовательно, все имеет смысл, поскольку, как указал kibab, дочерний процесс "наследует" настройки совместимости своего родительского процесса.
Думаю, это может быть только ты. т.е. ваш D2009 мог быть отмечен окнами как требующий запуска в режиме совместимости. Я создал тестовое приложение с вашей функцией, скомпилировал и запустил как с D2009, так и с D2010, внутри отладчика и извне (щелкните значок exe в проводнике Windows), и во всех 4 случаях он возвращался с: 6.1.7600 ()
Работает в Windows7, 32-разрядная версия.
Выполняется ли ваш исполняемый файл с определенными настройками совместимости (я предполагаю, что это может быть в случае устаревших приложений Delphi)? В документации к GetVersionEx
говорится:
Если действует режим совместимости, функция GetVersionEx сообщает об операционной системе в том виде, в каком она себя идентифицирует, что может не быть установленной операционной системой. Например, если действует режим совместимости, GetVersionEx сообщает об операционной системе, выбранной для совместимости приложений.
Может быть GetProductInfo
сможет делать то, что вы хотите?