11
votes

Comment déterminer le système d'exploitation

Comment implémenter une fonction qui retournera le nom du système d'exploitation? Détecter l'environnement où le programme fonctionnant sur?

Win2000 / XP / Vista / Win7 etc ...?


1 commentaires

Je pense que l'OP a eu plus d'informations qu'il aurait pu avoir rêvé! :)


7 Réponses :


20
votes

quelque chose comme ceci: xxx

Il n'est vraiment pas nécessaire d'appeler getversionex car sysutils.pas a initplatformid < / code> dans sa clause d'initialisation . D'où les constantes globales win32majorversion et win32minorversion (et amis) seront déjà remplacées.


5 commentaires

Faites très attention à ce que vous faites avec des numéros de version distincts / mineurs. Voir blogs.msdn.com/b/oldnewthing/archive /2004/02/13/72476.aspx


Earwicker @ Daniel: Oui, je sais que ce n'est pas l'histoire complète (ce qui est la raison pour laquelle je l'ai écrit « quelque chose comme ça »). Mais il est certainement un bon début.


Celui-ci est également manquant de la détection du système d'exploitation du serveur.


@Warren P: Oui, je sais que ce n'est pas l'histoire complète (c'est pourquoi j'ai écrit "quelque chose comme ça"). Mais c'est certainement un bon départ.


@Purscience: "Win32" est le nom de l'API Windows, même si le système d'exploitation est 64 bits.



11
votes

Aussi alternative à l'API Win32, vous pouvez utiliser le WMI win32_operatingsystem code> classe.

Vous pouvez écrire une fonction simple comme celle-ci pour extraire le nom de la version Windows de fonctionnement. P>

program GetWMI_Win32_OperatingSystem;

{$APPTYPE CONSOLE}

uses
  SysUtils
  ,ActiveX
  ,ComObj
  ,Variants;


Procedure  GetWin32_OperatingSystem;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
  colItems      := objWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  if oEnum.Next(1, colItem, iValue) = 0 then
  begin
    Writeln('Caption        '+colItem.Caption);
    Writeln('Version        '+colItem.Version);
    Writeln('BuildNumber    '+colItem.BuildNumber);
    Writeln('BuildType      '+colItem.BuildType);
    Writeln('CodeSet        '+colItem.CodeSet);
    Writeln('CountryCode    '+colItem.CountryCode);
    Writeln('BootDevice     '+colItem.BootDevice);
    Writeln;
  end;
end;


function  GetWin32_OSName:string;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
  colItems      := objWMIService.ExecQuery('SELECT Caption FROM Win32_OperatingSystem','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  if oEnum.Next(1, colItem, iValue) = 0 then
  Result:=colItem.Caption;
end;

begin
 try
    CoInitialize(nil);
    try
      GetWin32_OperatingSystem;
      //Writeln(GetWin32_OSName);
      Readln;
    finally
    CoUninitialize;
    end;
 except
    on E:Exception do
    Begin
        Writeln(E.Classname, ': ', E.Message);
        Readln;
    End;
  end;
end.


2 commentaires

Getwin32_osname était ce que je cherche depuis 2000 :) shorty et meilleur. Merci de sauvegarder ma journée.


Notez que cela n'est pris en charge que sur Vista ou supérieur.



4
votes

Je l'utilise dans mes programmes: xxx

xxx


1 commentaires

FYI: Il manque des systèmes d'exploitation Windows Server.



4
votes

Si vous souhaitez obtenir plus d'informations sur le système d'exploitation, vous pouvez utiliser WMI (le code de Rruz l'utiliser pour le nom). Pour plus d'informations, vous pouvez utiliser le composant coperatingsysteminfo de glibwmi (de Sourceforge ou WebPage d'auteur (mine) ;-d).
Toute la bibliothèque est gratuite et Sourve Code disponible. Pour le système d'exploitation, vous pouvez obtenir ces propriétés:

Texte alt http://a.imageshack.us/img594/1660/coperatinsysteminfo .png

Cordialement


0 commentaires

1
votes

Le JCL contient ce type énuméré:

function GetWindowsVersion: TWindowsVersion;


0 commentaires

0
votes
function OS_IsWindowsXP: Boolean;
begin
 Result:= (Win32MajorVersion= 5) AND (Win32MinorVersion= 1);
end;

function OS_IsWindowsXPUp: Boolean;
begin
 Result:= ((Win32MajorVersion = 5) AND (Win32MinorVersion>= 1))
        OR (Win32MajorVersion>= 6);
end;



function OS_IsWindowsVista: Boolean;
begin
 Result:= (Win32MajorVersion= 6) AND (Win32MinorVersion= 0);
end;

function OS_IsWindowsVistaUp: Boolean;
begin
 Result:= (Win32MajorVersion>= 6);
end;



function OS_IsWindows7: Boolean;
begin
 Result:= (Win32MajorVersion= 6) AND (Win32MinorVersion= 1);
end;

function OS_IsWindows7Up: Boolean;
begin
 Result:= ((Win32MajorVersion = 6) AND (Win32MinorVersion>= 1))   { Any version 6 equal and above Win7 }
        OR (Win32MajorVersion>= 7);                               { Any version above 6 }
end;



function OS_IsWindows8: Boolean;
begin
 Result:= (Win32MajorVersion = 6) AND (Win32MinorVersion= 2);
end;

function OS_IsWindows8Up: Boolean;
begin
 Result:= ((Win32MajorVersion = 6) AND (Win32MinorVersion>= 2))
        OR (Win32MajorVersion>= 7);
end;

0 commentaires