Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Вниз

Определение типа ОС   Найти похожие ветки 

 
h0use ©   (2004-02-12 15:26) [0]

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

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


 
h0use ©   (2004-02-12 16:53) [1]

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


 
pasha_golub ©   (2004-02-12 17:03) [2]

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

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


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

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


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

h0use ©   (12.02.04 15:26)  

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

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


 
h0use ©   (2004-02-12 18:04) [5]

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


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

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

Удачи!


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

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


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

h0use ©   (13.02.04 09:58)

Код в студию


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

Вот

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 11:32) [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 13:02) [11]

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

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

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


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

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:22) [13]

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

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

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


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


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


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

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


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

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


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

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

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

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


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

h0use ©   (13.02.04 16:23)

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

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


 
h0use ©   (2004-02-16 09:28) [18]

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


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

h0use ©   (16.02.04 09:28)

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



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.051 c
1-1080821800
Alex-21
2004-04-01 16:16
2004.04.18
Мерцание в CustomControl e


1-1080718810
neodiX
2004-03-31 11:40
2004.04.18
Delphi7, XPManifest, TGroupBox - отображение кириллицы. Решение!


14-1079762597
Alex Konshin
2004-03-20 09:03
2004.04.18
Купил новую машину


3-1079529989
Visnuk
2004-03-17 16:26
2004.04.18
Печать DBGrid с множественным выбором


14-1080142383
Да никто
2004-03-24 18:33
2004.04.18
Книга рекордов Гинесса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский