Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.055 c
1-1080643180
-kiril
2004-03-30 14:39
2004.04.18
SelectDirectory


3-1080037845
}|{yk
2004-03-23 13:30
2004.04.18
Поддержание синхронности БД


7-1076261620
Rentgen
2004-02-08 20:33
2004.04.18
Изменить иконку файла.


1-1080732957
Borealis
2004-03-31 15:35
2004.04.18
MDIChild в DLL


1-1080905497
Timur
2004-04-02 15:31
2004.04.18
wizard на delphi