Форум: "Система";
Текущий архив: 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