Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение типа ОС [D7, Win95/98, WinME, NT4, Win2k, WinXP]


h0use ©   (2004-02-12 15:26:00) 

Вот я нашел пример Игоря Шевченко http://delphibase.endimus.com/?action=viewfunc&topic=sysparams&id=10002

Однако есть вопрос. Как определить тип системы? Т.е например Windows XP может быть Home Edition, Professional; 2000-я может быть Server, Advanced Server, Professional... как определить?


Игорь Шевченко   (2004-02-16 10:28:00) [1]

h0use ©   (16.02.04 09:28)

Да, в зависимости от значения первого поля в структуре VersionInfo


h0use   (2004-02-16 09:28:00) [2]

Т.е. GetVersionExA(FVersionInfo.ov)заполняет не только FVersionInfo.ov, но и каким-то хитрым образом всю FVersionInfo?


Игорь Шевченко   (2004-02-13 17:36:00) [3]

h0use ©   (13.02.04 16:23)

Их заполняет функция GetVersionEx.

Просто эти поля заполняются не во всех системах.
В MSDN подробно написано, в каких именно.


h0use   (2004-02-13 16:23:00) [4]

Объясните хотя бы алгоритм заполенния

  wServicePackMajor : Word;
  wServicePackMinor : Word;
  wSuiteMask : Word;
  wProductType : Byte;
  wReserved  : Byte;

А то вообще непонятно откуда там данные должны взяться... :(


h0use   (2004-02-13 15:01:00) [5]

ov : TOsVersionInfoA; - это заполняется и все работает...но остальные строчки нулевые у меня :(


Игорь Шевченко   (2004-02-13 13:31:00) [6]


> Насколько я понял - это заполнение нулями структуры, но
> тогда где заполняются дополнительные поля wProductType и
> wSuiteMask


type
 TOsVersionInfoExA = packed record
   ov : TOsVersionInfoA;
   wServicePackMajor : Word;
   wServicePackMinor : Word;
   wSuiteMask : Word;
   wProductType : Byte;
   wReserved  : Byte;
 end;

Все заполняется, как надо.


h0use   (2004-02-13 13:22:00) [7]

Все равно не работает :( Все так и выдеает Windows XP Server :(

что делает эта строчка? FillChar(FVersionInfo, Sizeof(FVersionInfo), 0);

Насколько я понял - это заполнение нулями структуры, но тогда где заполняются дополнительные поля wProductType и wSuiteMask


Игорь Шевченко   (2004-02-13 13:11:00) [8]

h0use ©   (13.02.04 13:02)

А это уже выходит за рамки темы, нет ? :))

Все нижеследующее тестировалось только для NT-систем (Win9x у меня нет и не будет)

procedure TOSData.Collect;
begin
 if Win32Platform = VER_PLATFORM_WIN32_NT then
   with TRegistry.Create(KEY_READ) do
     try
       RootKey:=HKEY_LOCAL_MACHINE;
       if OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion',
           false) then begin
         FKernelType := ReadString('CurrentType');
         FOSRoot := ReadString('SystemRoot');
         FOsVersion := Format('%s.%s', [ReadString('CurrentVersion'),
                                      ReadString('CurrentBuildNumber')]);
         FProductId := ReadString('ProductId');
         FRegisteredOwner := ReadString('RegisteredOwner');
         FRegisteredCompany := ReadString('RegisteredOrganization');
         FServicePack := ReadString('CSDVersion');
         FInstallDate := ReadInteger('InstallDate');
         CloseKey();
       end;
       if OpenKey ('SYSTEM\CurrentControlSet\Control\Session Manager',
           false) then begin
         FLicensedProcessors := IntToStr(ReadInteger('RegisteredProcessors'));
         CloseKey();
       end;
     finally
       Free();
     end
   else if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin
     FLicensedProcessors := '1';
   end;
end;

function TOSData.GetInstallDate: String;
begin
 Result := FormatDateTime('dd.mm.yyyy', HSCTimeToDateTime(FInstallDate));
end;

function TOSData.GetOSCodeName: String;
begin
 Result := '';
 GetVersionInfo();
 if FVersionInfo.ov.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then begin
   if FVersionInfo.ov.dwMajorVersion = 4 then
     if FVersionInfo.ov.dwMinorVersion = 0 then begin
       if FVersionInfo.ov.dwBuildNumber = 950 then
         Result := 'Chicago'
     end else if FVersionInfo.ov.dwMinorVersion = 10 then begin
       if FVersionInfo.ov.dwBuildNumber = 1998 then
         Result := 'Memphis'
     end;
 end else if FVersionInfo.ov.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
   if FVersionInfo.ov.dwMajorVersion = 5 then
     if FVersionInfo.ov.dwMinorVersion = 0 then
       Result := 'Cairo'
     else if FVersionInfo.ov.dwMinorVersion = 1 then
       Result := 'Whistler'
     else if FVersionInfo.ov.dwMinorVersion = 2 then
       Result := 'Whistler Server'
 end;
end;

function TOSData.GetOSLanguage: String;
var
 SystemLocale : String;
begin
 SystemLocale := '';
 with TRegistry.Create(KEY_READ) do
   try
     RootKey:=HKEY_LOCAL_MACHINE;
     if OpenKey('SYSTEM\CurrentControlSet\Control\Nls\Language',
         false) then begin
       if ValueExists('InstallLanguage') then
         SystemLocale := ReadString('InstallLanguage')
       else
         SystemLocale := ReadString('Default');
       CloseKey();
     end;
   finally
     Free();
   end;
 Result := HSGetLocaleLanguageName(SystemLocale);
end;


{ Для определения языка в NT-системах предпочтительней вызывать Unicode-версию
 GetLocaleInfo }
function HSGetLocaleLanguageName (Locale : Cardinal) : String;
var
 tmp : array[0..255] of char;
 tmpW : array[0..255] of WideChar;
begin
 if Win32Platform = VER_PLATFORM_WIN32_NT then begin
   GetLocaleInfoW(Locale, LOCALE_SLANGUAGE, tmpW, SizeOf(tmpW));
   Result := WideCharToString(tmpW);
 end else begin
   GetLocaleInfo(Locale, LOCALE_SLANGUAGE, tmp, SizeOf(tmp));
   Result := tmp;
 end;
end;

function HSGetLocaleLanguageName (SLocale : String) : String;
var
 I : Integer;
 Locale : Cardinal;
begin
 Locale := 0;
 for I:=1 to 4 do
   Locale := (Locale shl 4) + Cardinal(Byte(SLocale[I]) - $30);
 Result := HSGetLocaleLanguageName (Locale);
end;

function HSCTimeToDateTime (Value : Integer) : TDateTime;
begin
{$IFDEF VER140}
 Result := UnixToDateTime(Value);
{$ELSE}
 Result := 0;
{$ENDIF}
end;


h0use   (2004-02-13 13:02:00) [9]

Огромное спасибо!

А вот это как определить :

FInstallDate : Integer;
FKernelType: String;
FLicensedProcessors: String;


Игорь Шевченко   (2004-02-13 11:32:00) [10]

function TOSData.GetProductName: String;
begin
 with TRegistry.Create(KEY_READ) do
   try
     RootKey:=HKEY_LOCAL_MACHINE;
     if OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion',
         false) and ValueExists('ProductName') then begin
       Result := ReadString('ProductName');
       CloseKey();
     end;
   finally
     Free();
   end;
 GetVersionInfo();
 if Result = '' then begin
   if FVersionInfo.ov.dwPlatformId = VER_PLATFORM_WIN32_NT then
     case FVersionInfo.ov.dwMajorVersion of
     3,4:
       Result := 'Microsoft Windows NT';
     5:
       if FVersionInfo.ov.dwMinorVersion = 0 then
         Result := 'Microsoft Windows 2000'
       else if FVersionInfo.ov.dwMinorVersion = 1 then
         Result := 'Microsoft Windows XP'
       else if FVersionInfo.ov.dwMinorVersion = 2 then
         Result := 'Microsoft Windows 2003'
     end;
 end;
 { Узнать дополнительные характеристики системы }
 if (FVersionInfo.wSuiteMask and VER_SUITE_PERSONAL) <> 0 then
   Result := Result + ' Home edition'
 else if FVersionInfo.wProductType = VER_NT_WORKSTATION then
   if FVersionInfo.ov.dwMajorVersion >= 5 then
     Result := Result + ' Professional'
   else
     Result := Result + ' Workstation'
 else if (FVersionInfo.wProductType = VER_NT_SERVER) or
         (FVersionInfo.wProductType = VER_NT_DOMAIN_CONTROLLER) then
   if (FVersionInfo.wSuiteMask and
       (VER_SUITE_DATACENTER or VER_SUITE_ENTERPRISE)) = 0 then
     Result := Result + ' Server'
   else if ((FVersionInfo.wSuiteMask and VER_SUITE_ENTERPRISE) <> 0) and
           ((FVersionInfo.wSuiteMask and VER_SUITE_DATACENTER) = 0) then
     if (FVersionInfo.ov.dwMajorVersion = 5) and
        (FVersionInfo.ov.dwMinorVersion = 2) then
       Result := Result + ' Server (Enterprise edition)'
     else
       Result := Result + ' Advanced Server'
   else if (FVersionInfo.wSuiteMask and VER_SUITE_DATACENTER) <> 0 then
     Result := Result + ' Datacenter Server'
end;


procedure TOSData.GetVersionInfo;
begin
 FillChar(FVersionInfo, Sizeof(FVersionInfo), 0);
 FVersionInfo.ov.dwOSVersionInfoSize := Sizeof(FVersionInfo);
 if not GetVersionExA(FVersionInfo.ov) then begin
   FVersionInfo.ov.dwOSVersionInfoSize := Sizeof(TOsVersionInfoA);
   GetVersionExA(FVersionInfo.ov);
 end;
end;


type
 TOSData = class(TInfoData)
 private
   FInstallDate : Integer;
   FKernelType: String;
   FLicensedProcessors: String;
   FOSRoot: String;
   FOSVersion: String;
   FProductId: String;
   FRegisteredCompany: String;
   FRegisteredOwner: String;
   FServicePack: String;
   FVersionInfo : TOsVersionInfoExA;

   procedure GetVersionInfo;
   function GetProductName : String;


h0use   (2004-02-13 11:10:00) [11]

Вот

function TNSWOSInfo.GetOSType: string;
begin
 Result:='n/a';
 case FVerData.wProductType of
   VER_NT_WORKSTATION :
     if (GetOSName='Windows NT 4.0') or (GetOSName='Windows NT 3.51')
     then Result:='Workstation'
     else
       if (GetOSName='Windows 2000') or (GetOSName='Windows XP')
       then Result:='Professional';
   VER_NT_DOMAIN_CONTROLLER :
     if FVerData.OSVer.dwPlatformId=VER_PLATFORM_WIN32_NT
     then Result:='Advanced Server';
   VER_NT_SERVER :
     if FVerData.OSVer.dwPlatformId=VER_PLATFORM_WIN32_NT
     then Result:='Server'
 end;    // case}
end;    // GetOSType


Игорь Шевченко   (2004-02-13 10:43:00) [12]

h0use ©   (13.02.04 09:58)

Код в студию


h0use   (2004-02-13 09:58:00) [13]

Странно..но почему же у меня тогда моя ХР пишет что она Advanced server хотя она просто Proffessional?


Игорь Шевченко   (2004-02-12 18:19:00) [14]

Все дело в SizeOf в первом вызове. Если система не поддерживает дополнительные поля, то они не никак не заполнятся, а если поддерживает, то первый вызов завершится успешно и нужные поля будут заполнены.

Удачи!


h0use   (2004-02-12 18:04:00) [15]

Это я как раз понял..только в приведенном исходнике заполняется только запись old:TOsVersionInfoA;А все остальные поля так и "висят в воздухе".


Игорь Шевченко   (2004-02-12 17:28:00) [16]

h0use ©   (12.02.04 15:26)  

"type
 TOsVersionInfoExA = packed record
   old : TOsVersionInfoA;
   wServicePackMajor : Word;
   wServicePackMinor : Word;
{
wSuiteMask
Набор битовых флагов, определяющих компоненты Windows
VER_SUITE_BACKOFFICE Установлен компонент Microsoft BackOffice.
"

Вот с этого места читай внимательно


Vit@ly   (2004-02-12 17:15:00) [17]

А тебе не достаточно определения типа оси (Win9x  WinNT). Где и как это можно использовать?


pasha_golub   (2004-02-12 17:03:00) [18]

h0use ©   (12.02.04 16:53) [1]
А зачем?

А вообщето надо смотреть номер билда,  ИМХО


h0use   (2004-02-12 16:53:00) [19]

Ау? Неужели никто это не пробовал определять?


Наверх

Титульная страница Поиск, карта сайта Написать письмо