Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > версия WIN


Автор: Штабс 1.2.2005, 11:09
Hi Pipl

Нужна срочная помощь
необходимо разобрать платформу

2000
2000 Server
ХР
2003
2003 Server

по возможности с паками....

понимаю что оч много прошу...но за сегодня это для меня многовато

Автор: Snowy 1.2.2005, 11:18
Код

function GetWindowsVersion:string;
var
 osv : OSVersionInfo;
Begin
osv.dwOSVersionInfoSize:=sizeOf(osv); GetVersionEx(osv);
result:=format('%d.%d',[osv.dwMajorVersion, osv.dwMinorVersion])+'.'+intToStr(LoWord(osv.dwBuildNumber));
end;

Добавлено @ 11:21
WinXP - это 5.1.2600
Win2003 Server - 5.2.3790 (а бывает 20003 не сервер?)
Win2000 Server - 5.0.xxxx (напр 2195) зависит от сервиспаков.

Автор: Штабс 1.2.2005, 11:24
Snowy
блин с меня встреча с пивом
smile)
не напрягайся не нравиться не будет
// я ее начал уже кодить но засомневался...уж больон просто

последний штрих

существует до хрена паков
они не испортят мне малину?

Автор: Girder 1.2.2005, 11:40
1.
Код

procedure TForm1.Button1Click(Sender: TObject);
var i:_osversioninfoa;
begin
i.dwOSVersionInfoSize:=SizeOf(i);
GetVersionEx(i);
//... разбор палетов
Caption:=i.szCSDVersion;
end;


2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates - обнавления

3.До кучи:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

Автор: Snowy 1.2.2005, 11:52
Основное различие:
Win2000 - 5.0
Win XP - 5.1
Win 2003 - 5.2
Далее различие в билдах.
Если нужно различать сервер-несервер, то проведи исследование по машинам.
В коммандной строке комманда ver скажет версию и билд.
Посмотри какие бывают билды, сделай выводы.
У меня под рукой тока 2 машины с XP, 2 с 2k3 и одна с 2k.
Свои билды написал выше. Смотри у себя...

Автор: Штабс 1.2.2005, 11:56
чисто теоретически
Windows 2000 Servis Pack 4 (SP4)
Windows XP Servis Pack 1 (SP1)
будет работать не коректно

Автор: Girder 1.2.2005, 12:08
Штабс всю информацию можеш найти здесь:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getversionex.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/osversioninfo_str.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/osversioninfoex_str.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getting_the_system_version.asp

PS:
Цитата
так вот это может и помешать

Что помешать? smile Не понял smile Объясни ущербному smile Что ты хочеш?

Автор: Штабс 1.2.2005, 12:18
увж. Girder
именно это у меня сейчас и открыто

Windows 2000 Servis Pack 4 (SP4)
Windows XP Servis Pack 1 (SP1)

это тоже от туда см. мою борьбу с ошибкой 1783

паки есть
но за плату и кому то от фирмы

так вот это может и помешать

Автор: Snowy 1.2.2005, 12:21
Да, более, чем подробно :-) Только линки микрософт не пропускает. Но поиском найти можно.

Автор: Snowy 1.2.2005, 13:01
Вот набросал такую штучку. Это по хэлпу дельфи и ее структурам. Сейчас доработаю по SDK.
Код

function GetWindowsName:string;
var
 osv : OSVersionInfo;
 l: string;
Begin
osv.dwOSVersionInfoSize:=sizeOf(osv); GetVersionEx(osv);
case osv.dwMajorVersion of
  4: case osv.dwMinorVersion of
        0: case osv.dwPlatformId of
             VER_PLATFORM_WIN32_NT: l:='NT 4.0';
             else l:='95';
           end;
       10: l:='98';
       90: l:='Me';
       else l:='9x';
     end;
  5: case osv.dwMinorVersion of
       0: l:='2000';
       1: l:='XP';
       2: l:='2003';
       else l:='NT 5.'+IntToStr(osv.dwMinorVersion);
     end;
  else l:='NT '+IntToStr(osv.dwMajorVersion)+'.'+IntToStr(osv.dwMinorVersion);
end;
l:='Windows '+l+' '+string(osv.szCSDVersion);
result:=l;
end;

Автор: Snowy 1.2.2005, 13:42
Вот написал определение имени виндов по SDK. Пришлось, правда, переопределить структуру TOSVersionInfo и заново импортировать GetVersionEx. Так что теперь можно не подключать модуль Windows smile
Хотел запихнуть все в одну функцию, но передумал из-за импорта. Пришлось бы мудрить с указателями, если тип описывать внутри функции.
Код

type TOSVersionInfo=packed record
 dwOSVersionInfoSize: dword;
 dwMajorVersion: dword;
 dwMinorVersion: dword;
 dwBuildNumber:  dword;
 dwPlatformId: dword;
 szCSDVersion: array[0..127] of char;
 wServicePackMajor: word;
 wServicePackMinor: word;
 wSuiteMask:        word;
 wProductType:      byte;
 wReserved:         byte;
end;

function GetVersionEx(var lpVersionInformation: TOSVersionInfo): BOOL; stdcall; external kernel32 name 'GetVersionExA';

function GetWindowsName:string;
var
 osv : TOSVersionInfo;
 l: string;
Begin
osv.dwOSVersionInfoSize:=sizeOf(osv); GetVersionEx(osv);
case osv.dwMajorVersion of
  4: case osv.dwMinorVersion of
        0: case osv.dwPlatformId of
             VER_PLATFORM_WIN32_NT: l:='NT 4.0';
             else l:='95';
           end;
       10: l:='98';
       90: l:='Me';
       else l:='9x';
     end;
  5: case osv.dwMinorVersion of
       0: if osv.wSuiteMask=2 then l:='2000 Advanced Server'
          else if osv.wProductType>1 then l:='2000 Server'
          else l:='2000';
       1: case  osv.wSuiteMask of
            $40:  l:='XP Embedded';
            $200: l:='XP Home';
            else  l:='XP Professional';
          end;
       2: begin
            l:='2003';
            if osv.wProductType>1 then l:='2003 Server';
            case osv.wSuiteMask of
              $400: l:=l+', Web Edition';
              $80:  l:=l+', Datacenter Edition';
              $2:   l:=l+', Enterprise Edition';
            end;
          end;
       else l:='NT 5.'+IntToStr(osv.dwMinorVersion);
     end;
  else l:='NT '+IntToStr(osv.dwMajorVersion)+'.'+IntToStr(osv.dwMinorVersion);
end;
l:='Windows '+l+' '+string(osv.szCSDVersion);
result:=l;
end;

Автор: Snowy 1.2.2005, 14:05
Да, забыл. Первый пример выдает имя операционки с сервис паком.
Второй пример кроме этого, различает сервер-несервер и вариант операционки (типа Home/Professional).

Автор: Snowy 1.2.2005, 15:34
Что-то я развел кипучую деятельность по простому вопросу smile
Вот готовый код для получения полного наименования операционки.
Оформил в виде отдельного юнита с одной функцией.
Код

unit WinName;

interface

function GetWindowsName:string; //Возвращает полное название Windows

implementation

type

 DWORD = Longword;

 TOSVersionInfo=packed record
   dwOSVersionInfoSize: dword;
   dwMajorVersion: dword;
   dwMinorVersion: dword;
   dwBuildNumber:  dword;
   dwPlatformId: dword;
   szCSDVersion: array[0..127] of char;
   wServicePackMajor: word;
   wServicePackMinor: word;
   wSuiteMask:        word;
   wProductType:      byte;
   wReserved:         byte;
 end;

const VER_PLATFORM_WIN32_NT = 2;

function IntToStr(i:integer):string;
begin str(i,result); end;

function GetVersionEx(var lpVersionInformation: TOSVersionInfo): boolean; stdcall; external 'kernel32.dll' name 'GetVersionExA';

function GetWindowsName:string;
var
 osv : TOSVersionInfo;
 l: string;
Begin
osv.dwOSVersionInfoSize:=sizeOf(osv); GetVersionEx(osv);
case osv.dwMajorVersion of
  4: case osv.dwMinorVersion of
        0: case osv.dwPlatformId of
             VER_PLATFORM_WIN32_NT: l:='NT 4.0';
             else l:='95';
           end;
       10: l:='98';
       90: l:='Me';
       else l:='9x';
     end;
  5: case osv.dwMinorVersion of
       0: if osv.wSuiteMask=2 then l:='2000 Advanced Server'
          else if osv.wProductType>1 then l:='2000 Server'
          else l:='2000';
       1: case  osv.wSuiteMask of
            $40:  l:='XP Embedded';
            $200: l:='XP Home';
            else  l:='XP Professional';
          end;
       2: begin
            l:='2003';
            if osv.wProductType>1 then l:='2003 Server';
            case osv.wSuiteMask of
              $400: l:=l+', Web Edition';
              $80:  l:=l+', Datacenter Edition';
              $2:   l:=l+', Enterprise Edition';
            end;
          end;
       else l:='NT 5.'+IntToStr(osv.dwMinorVersion);
     end;
  else l:='NT '+IntToStr(osv.dwMajorVersion)+'.'+IntToStr(osv.dwMinorVersion);
end;
l:='Windows '+l+' '+string(osv.szCSDVersion);
result:=l;
end;

end.

Раздела uses нет, поскольку все равно пришлось переопределять работу с GetVersionEx.
Пример работы (хотя он и нафиг не нужен):
Код

program WindowsName;
{$APPTYPE CONSOLE}
uses WinName in 'WinName.pas';

begin
 WriteLn(GetWindowsName);
end.

откомпиленая функция весит 2.5кб. Можно включить в коллекцию, если ни у кого замечаний нет.

Автор: Штабс 1.2.2005, 15:48
Snowy
Это перебор
право

прошу остановитесь
а то так разучимся думать и искать

с учетом вашего переделываю свой проект...
пока вроде ОК
к завтраму скажу точнее...для отловки жуков нужно время...думаю ночи хватит

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)