Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Какую OS юзает пользователь?


Автор: navodri 11.1.2010, 13:48
Как определить, что пользователь юзает Windows 7?   smile  Спасибо!

Автор: Демо 11.1.2010, 14:09
Функция GetVersionEx - http://msdn.microsoft.com/en-us/library/ms724451(VS.85).aspx

Автор: navodri 11.1.2010, 14:14
Ну, и где там речь о Windows 7 (или хотя бы о Viste) ? И, кстати, значок  smile  не просто так прилеплен...

Автор: Демо 11.1.2010, 14:25
Цитата(navodri @  11.1.2010,  14:14 Найти цитируемый пост)
Ну, и где там речь о Windows 7 (или хотя бы о Viste) ? И, кстати, значок    не просто так прилеплен...


Я так понимаю, MSDN читать не умеем?

Далее ссылка на OSVERSIONINFO Structure

Схема такая

Код

var
  OV: TOSVERSIONINFO;
begin
  OV.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
  GetVersionEx(OV);


далее проверяем всё, что указано по второй ссылке - http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx

Автор: artsb 11.1.2010, 15:19
Цитата(navodri @  11.1.2010,  14:14 Найти цитируемый пост)
И, кстати, значок  smile  не просто так прилеплен... 

Код

 OSVERSIONINFOEX ov;
 ov.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

 GetVersionEx((OSVERSIONINFO*)&ov);

 if(ov.dwMajorVersion == 6 &&
    ov.dwMinorVersion == 1 &&
    ov.wProductType   == VER_NT_WORKSTATION)
  Caption = "TRUE";

надеюсь здесь переведёт кто-нибудь smile

Замечание: если вы пишете в Delphi7 (или младше) под Win7 (Vista), то вы наверняка запускаете среду в режиме совместимости с WinXP. В этом случае, код, который выше, не изменит Caption формы на "TRUE", т.к. определится WinXP. Но если запустить приложение не из под среды - всё ОК. Будьте внимательны.

Автор: profesiachuvak 12.1.2010, 15:36
Цитата(artsb @  11.1.2010,  15:19 Найти цитируемый пост)
Замечание: если вы пишете в Delphi7 (или младше) под Win7 (Vista), то вы наверняка запускаете среду в режиме совместимости с WinXP. В этом случае, код, который выше, не изменит Caption формы на "TRUE", т.к. определится WinXP. Но если запустить приложение не из под среды - всё ОК. Будьте внимательны. 


Я так понимаю, что сама среда delphi7 работает только в режиме совместимости? А какая версия будет работать под Win7 без этого режима? 

з.ы. И как же определить тогда что мы работаем в Win7 обойдя этот режим совместимости?

Автор: artsb 12.1.2010, 15:48
Цитата(profesiachuvak @  12.1.2010,  15:36 Найти цитируемый пост)
А какая версия будет работать под Win7 без этого режима? 

ИМХО с 2006. Хотя может и позднее. Точно не знаю smile Но в 2010 работает и так.

Цитата(profesiachuvak @  12.1.2010,  15:36 Найти цитируемый пост)
И как же определить тогда что мы работаем в Win7 обойдя этот режим совместимости? 

Получается никак. Только запускать не из под среды если.

Автор: Демо 12.1.2010, 17:08
хм. У меня D6 в обычном режиме работает. А почему он должен в режиме совместимости работать?

Автор: CodeMonkey 12.1.2010, 18:18
Цитата(Демо @  12.1.2010,  17:08 Найти цитируемый пост)
У меня D6 в обычном режиме работает

А в кнопочке About что пишет?

Добавлено через 1 минуту и 53 секунды
Цитата(Демо @  12.1.2010,  17:08 Найти цитируемый пост)
А почему он должен в режиме совместимости работать?

Типа, неполная совместимость, поэтому может форсированно запускаться в режиме совместимости с XP SP2. Хз, применимо ли к Delphi 6.

Автор: artsb 12.1.2010, 18:31
Цитата(Демо @  12.1.2010,  17:08 Найти цитируемый пост)
А почему он должен в режиме совместимости работать? 

Я не писал, что он должен. Я говорю, что такое возможно.
Кстати, мне кажется, что даже если вы насильно не задавали режим совместимости, система всё равно запускает среду в режиме совместимости.
Проверьте: возьмите код выше, засуньте его в обработчик нажатия кнопки, запустите приложение из под среды и нажмите кнопку. Если в Caption появится TRUE, значит всё ОК.
Лично у меня, при запуске из под BCB 6 Caption не изменяется. А вот при запуске из под 2010 всё ОК.

Добавлено через 1 минуту и 49 секунд
Цитата(CodeMonkey @  12.1.2010,  18:18 Найти цитируемый пост)
А в кнопочке About что пишет?


У меня пишет WinXP smile

Автор: navodri 12.1.2010, 18:35
Я понял. Ребята, а есть что-то проще? Ну, типа Windows Vista или Windows 7? Мне НЕ надо определять версию (вроде 6.1 build...) и т.п. А просто, под какой мы операционкой? Ну, помните, как в старые добрые времена типа: 

Код

function IsWin9x: Bool; {True = Win9x} { False = NT}
asm
 xor eax, eax
 mov ecx, cs
 xor cl, cl
 jecxz @@quit
 inc eax
 @@quit:
end;

Автор: artsb 12.1.2010, 18:44
navodri, читайте MSDN. Я привёл код как определить под Win7 мы или нет.

Добавлено через 11 минут и 49 секунд
Цитата(navodri @  12.1.2010,  18:35 Найти цитируемый пост)
А просто, под какой мы операционкой?

Тут и так всё просто. Всего-то 5 строк smile Куда ещё проще...

Автор: artsb 12.1.2010, 19:42
Вот вам на Делфи:
Код

const VER_NT_WORKSTATION = 1;
// ...
procedure TForm1.Button1Click(Sender: TObject);
var
 ov: OSVERSIONINFOEX;
begin
 ov.dwOSVersionInfoSize := sizeof(OSVERSIONINFOEX);
 GetVersionEx(ov);
 if (ov.dwMajorVersion = 6) and
    (ov.dwMinorVersion = 1) and
    (ov.wProductType   = VER_NT_WORKSTATION) then
  Caption := 'TRUE';
end;

Автор: bems 12.1.2010, 19:53
Цитата(artsb @  12.1.2010,  15:48 Найти цитируемый пост)
Получается никак. Только запускать не из под среды если. 

А манифест разве не решает проблему?

Цитата(navodri @  12.1.2010,  18:35 Найти цитируемый пост)
Ну, помните, как в старые добрые времена типа

Это старые гланды через добрую задницу. Правильный способ тебе дали выше.

Автор: CodeMonkey 12.1.2010, 20:10
Ребят, зачем нам API? Мы в Delphi работаем, у нас оболочки есть. Например, такие:

Код
procedure TForm1.Button1Click(Sender: TObject);
begin
  if CheckWin32Version(5, 0) then
    Caption := 'Win2000 or above';

  if CheckWin32Version(5, 1) then
    Caption := 'WinXP or above';

  if CheckWin32Version(5, 2) then
    Caption := 'Win2003 or Win2003 R2 or above';

  if CheckWin32Version(6, 0) then
    Caption := 'WinVista or Win2008 or above';

  if CheckWin32Version(6, 1) then
    Caption := 'Win7 or Win2008 R2 or above';
end;


Добавлено через 1 минуту и 7 секунд
Цитата(bems @  12.1.2010,  19:53 Найти цитируемый пост)
А манифест разве не решает проблему?

Я думаю, что должон решать. Только его ведь может и не быть. А если он есть, то должен быть от Висты/7-ки. XP-вый не подойдёт.

Автор: bems 12.1.2010, 20:15
Цитата(CodeMonkey @  12.1.2010,  20:10 Найти цитируемый пост)
Только его ведь может и не быть.
Ну добавить же не проблема ведь. Нет?

Автор: CodeMonkey 12.1.2010, 20:52
Цитата(bems @  12.1.2010,  20:15 Найти цитируемый пост)
Ну добавить же не проблема ведь. Нет?

Ну, обычно нет. Но мало ли. Вдруг нам как раз нужны эти хаки совместимости, потому что у нас куча кривого кода.

Автор: bems 12.1.2010, 21:20
И заодно мы хотим знать настоящую версию винды, потому что хаки не действуют в достаточной степени для того, чтобы можно было игнорировать её...

Ну нельзя исключать этот случай, хотя очевидно же, что кошмар. Да уж...

Автор: Демо 12.1.2010, 21:39
Цитата(CodeMonkey @  12.1.2010,  18:18 Найти цитируемый пост)
А в кнопочке About что пишет?


У меня в D6 в About пишет 
Windows 2000 (Build 7600)  (У меня Windows Seven x64)

Но это не значит, что он в режиме совместимости работает.
Просто на время выпуска Delphi понятия Windows 7 ещё не было.

Автор: artsb 12.1.2010, 21:48
Цитата(bems @  12.1.2010,  19:53 Найти цитируемый пост)
А манифест разве не решает проблему?

А причём тут манифест? Я говорю, что если запускать прогу из под среды (F9), то результат работы кода неверен. Если же запустить прогу просто из под винды - всё ОК. Или я вас неправильно понял?

Цитата(CodeMonkey @  12.1.2010,  20:10 Найти цитируемый пост)
CheckWin32Version

Эм... Что это за функция такая? Ни ВСВ 6, ни Делфи 2010 её не знают. Но поиск в гугле показал, что такая должна быть в Делфи 6. И первые же строки в гугле "говорят" о том, что она работает неправильно  smile 

Цитата(CodeMonkey @  12.1.2010,  20:10 Найти цитируемый пост)
Ребят, зачем нам API? Мы в Delphi работаем, у нас оболочки есть. Например, такие:

Кстати, даже в них, наверное, не обошлось без WinAPI. Надо бы исходник глянуть, но у меня нет Делфи 6.

Автор: Демо 12.1.2010, 21:49
PS. Уменя показывает     
Код

Caption := 'Win7 or Win2008 R2 or above';


Добавлено @ 21:50
Цитата(artsb @  12.1.2010,  21:48 Найти цитируемый пост)
Кстати, даже в них, наверное, не обошлось без WinAPI


Конечно не обошлось.

Код

{$IFDEF MSWINDOWS}
procedure InitPlatformId;
var
  OSVersionInfo: TOSVersionInfo;
begin
  OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
  if GetVersionEx(OSVersionInfo) then
    with OSVersionInfo do
    begin
      Win32Platform := dwPlatformId;
      Win32MajorVersion := dwMajorVersion;
      Win32MinorVersion := dwMinorVersion;
      Win32BuildNumber := dwBuildNumber;
      Win32CSDVersion := szCSDVersion;
    end;
end;

function CheckWin32Version(AMajor: Integer; AMinor: Integer = 0): Boolean;
begin
  Result := (AMajor > Win32MajorVersion) or
            ((AMajor = Win32MajorVersion) and
             (AMinor >= Win32MinorVersion));
end;


Автор: artsb 12.1.2010, 22:01
CodeMonkey, кстати, эта проверка не даёт точного результата (о котором просил ТС):
Код

CheckWin32Version(6, 1)

В http://msdn.microsoft.com/en-us/library/ms724833%28VS.85%29.aspx написано, что для Win7 должно ещё выполняться условие:
Код

OSVERSIONINFOEX.wProductType = VER_NT_WORKSTATION

, а для Windows Server 2008 R2
Код

OSVERSIONINFOEX.wProductType <> VER_NT_WORKSTATION

Автор: CodeMonkey 13.1.2010, 00:10
Цитата(artsb @  12.1.2010,  21:48 Найти цитируемый пост)
А причём тут манифест?

При том, что в режиме совместимости могут быть запущены только "старые" программы. Программа с вистовским манифестом (очевидно) старой не является.

Цитата(artsb @  12.1.2010,  21:48 Найти цитируемый пост)
Ни ВСВ 6, ни Делфи 2010 её не знают.

Угу. Конечно. http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_CheckWin32Version.html. Начиная с Delphi 6.

Цитата(artsb @  12.1.2010,  21:48 Найти цитируемый пост)
она работает неправильно

Только в Delphi 6.

Цитата(artsb @  12.1.2010,  21:48 Найти цитируемый пост)
даже в них, наверное, не обошлось без WinAPI

Несомненно, они работают http://transl-gunsmoker.blogspot.com/2009/10/windows-nt.html.

Цитата(artsb @  12.1.2010,  22:01 Найти цитируемый пост)
эта проверка не даёт точного результата (о котором просил ТС)

Автор вопроса не просил точной проверки:
Цитата(navodri @  12.1.2010,  18:35 Найти цитируемый пост)
Мне НЕ надо определять версию (вроде 6.1 build...) и т.п. А просто, под какой мы операционкой?


Как я понимаю вопрос, автор выбирает ветку выполнения в зависимости от "уровня" операционки. Типа, можно ли использовать определённые флаги или функции. А Win7 в этом плане не отличается от Win2008 R2.

Цитата(artsb @  12.1.2010,  22:01 Найти цитируемый пост)
В МСДН написано, что для Win7 должно ещё выполняться условие

По-моему, я чётко написал: "Win7 or Win2008 R2 or above", ага?

Цитата(Демо @  12.1.2010,  21:39 Найти цитируемый пост)
Но это не значит, что он в режиме совместимости работает.

Согласен, не значит. И судя по About, там похоже на Win7. Build 7600 - это от Win7.
Просто помощник по совместимости программ запускается автоматически, обнаруживая старую программу с проблемой совместимости. А при запуске старых Дельфей, диалог помощника точно всплывает. Так что пока непонятно, надо бы эксперимент провести. Мне 7-ку/6-ку ставить лениво smile

Автор: artsb 13.1.2010, 09:45
CodeMonkey, ТС писал:
Цитата(navodri @  11.1.2010,  13:48 Найти цитируемый пост)
Как определить, что пользователь юзает Windows 7?

Поэтому я и написал именно для определения Win7. Вдруг его код не должен работать под Win2008 R2  smile 
И оставим эту тему уже smile  . ТС сам выберет, что ему нужно.

Цитата(CodeMonkey @  13.1.2010,  00:10 Найти цитируемый пост)
При том, что в режиме совместимости могут быть запущены только "старые" программы. Программа с вистовским манифестом (очевидно) старой не является.

Ясно. Спс.

Автор: navodri 29.1.2010, 14:57
Ребята! Всем спасибо. Простите, что багодарность с запозданием... Вот код без лишних наворотов, который отлично работает. Проверено!

Код

function CheckWin32Version(AMajor: Integer; AMinor: Integer): Boolean;
begin
  Result := (Win32MajorVersion > AMajor) or
            ((Win32MajorVersion = AMajor) and
             (Win32MinorVersion >= AMinor));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)) then caption := 'Windows 98';
  if (Win32MajorVersion > 4) and (Win32Platform = VER_PLATFORM_WIN32_NT) then caption := 'Windows 2K';
  if CheckWin32Version(5, 1) then caption := 'Windows XP';
  if CheckWin32Version(6, 0) then caption := 'Windows Vista';
  if CheckWin32Version(6, 1) then caption := 'Windows 7';
end;

Автор: CodeMonkey 29.1.2010, 15:48
1. Если у вас Delphi 7 или выше, то реализацию CheckWin32Version можете выкинуть - она и так есть.
2. Непонятны первые две строчки в Button1Click. Есть мнение, что вам надо так:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
  if CheckWin32Version(4, 0) then Caption := 'Windows 95';
  if CheckWin32Version(4, 1) then Caption := 'Windows 98';
  if CheckWin32Version(5, 0) then Caption := 'Windows 2K';
  if CheckWin32Version(5, 1) then Caption := 'Windows XP';
  if CheckWin32Version(6, 0) then Caption := 'Windows Vista';
  if CheckWin32Version(6, 1) then Caption := 'Windows 7';
end;

3. Надеюсь вы уловили, что мы тут говорили про Windows Vista = Windows Server 2008, да? smile

Добавлено через 5 минут и 9 секунд
http://17slon.com/blogs/gabr/2007/02/four-ways-to-detect-vista.html (как видим - нет прямого пути, только обходные; выглядит логичным).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)