![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение типа ОС [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]Ау? Неужели никто это не пробовал определять?