IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Delphi Discussion :

Astuce: Obtenir la version Windows


Sujet :

Contribuez Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 93
    Par défaut Astuce: Obtenir la version Windows
    NOTE AJOUTÉE: VOIR LE MESSAGE #10 POUR LE CODE FINAL (revu et corrigé)

    ASTUCE: Comment identifier avec certitude la version Windows.

    Réponse: En examinant toutes les fonctions API exportées par kernel32.dll
    Ces fonctions sont différentes pour chaque version:

    Ainsi:

    GetLocaleInfoEx
    Vista, Server 2003, XP SP1, XP SP2, 2000, ME, NT4, 98, 95
    GetLargePageMinimum Vista, Server
    GetDLLDirectory Vista, Server 2003, XP, SP1
    GetNativeSystemInfo Vista, Server 2003, XP SP1, XP
    ReplaceFile Vista, Server 2003, XP SP1, XP, 2000
    OpenThread Vista, Server 2003, XP SP1, XP, 2000, ME
    GetThreadPriorityBoost Vista, Server 2003, XP SP1, XP, 2000, NT4
    IsDebuggerPresent Vista, Server 2003, XP SP1, XP, 2000, ME, NT4, 98
    GetDiskFreeSpaceEx Vista, Server 2003, XP SP1, XP, 2000, ME, NT4, 98, 95, 95R2
    ConnectNamedPipe Vista, Server 2003, XP SP1, XP, 2000, NT3
    Beep Vista, Server 2003, XP SP1, XP, 2000, ME, 98, NT3, 95

    Cette fonction résume le tout:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
      function GetTrueWindowsVersion: TWindowsVersion;
     
        function ExportsAPI(module: HMODULE; const apiName: string): boolean;
        begin
          Result := GetProcAddress(module, PChar(apiName)) <> nil;
        end; { ExportsAPI }
     
      var
        hKernel32: HMODULE;
     
      begin { GetTrueWindowsVersion }
        hKernel32 := GetModuleHandle('kernel32');
        Win32Check(hKernel32 <> 0);
        if ExportsAPI(hKernel32, 'GetLocaleInfoEx') then
          Result := wvWinVista
        else if ExportsAPI(hKernel32, 'GetLargePageMinimum') then
          Result := wvWinServer2003
        else if ExportsAPI(hKernel32, 'GetNativeSystemInfo') then
          Result := wvWinXP
        else if ExportsAPI(hKernel32, 'ReplaceFile') then
          Result := wvWin2000
        else if ExportsAPI(hKernel32, 'OpenThread') then
          Result := wvWinME
        else if ExportsAPI(hKernel32, 'GetThreadPriorityBoost') then
          Result := wvWinNT4
        else if ExportsAPI(hKernel32, 'IsDebuggerPresent') then  //aussi dans NT4
          Result := wvWin98
        else if ExportsAPI(hKernel32, 'GetDiskFreeSpaceEx') then  //aussi dans NT4
          Result := wvWin95OSR2
        else if ExportsAPI(hKernel32, 'ConnectNamedPipe') then
          Result := wvWinNT3
        else if ExportsAPI(hKernel32, 'Beep') then
          Result := wvWin95
        else // aucune idée de quoi il s'agit alors
          Result := GetWindowsVersion;
      end; { GetTrueWindowsVersion }

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Merci pour ta contribution
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut
    Yep !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function GetTrueWindowsVersion: TWindowsVersion;
    Et ce TWindowsVersion, il est déclaré où et comment ?
    Que mon D7 ne le connait pas...

    Et ça,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      else // aucune idée de quoi il s'agit alors
        Result := GetWindowsVersion;
    Que mon SDK ne connait pas plus...
    Merci,
    --
    jp

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 93
    Par défaut
    Ok ..... alors voilà tout le contexte, avec l'export de l'API et les constantes - évidemment j'avais oublié! - désolé.

    Reste à voir si c'est valide pour Delphi 7.
    Pour Delphi 2006 c'est bon.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    unit WinVersion;
     
    uses
      Windows,
      Messages,
      Consts,
      SysUtils,
      Classes,
     
    type
      TWindowsVersion = (wvUnknown, wvWin31, wvWin95, wvWin95OSR2, wvWin98,
        wvWin98SE, wvWinME, wvWin9x, wvWinNT3, wvWinNT4, wvWin2000, wvWinXP,
        wvWinNT, wvWinServer2003, wvWinVista);
     
    const
      CWindowsVersionStr: array [TWindowsVersion] of string = ('Inconnu',
        'Windows 3.1', 'Windows 95', 'Windows 95 OSR 2', 'Windows 98',
        'Windows 98 SE', 'Windows Me', 'Windows 9x', 'Windows NT 3.5',
        'Windows NT 4', 'Windows 2000', 'Windows XP', 'Windows NT', 'Windows Server 2003',
        'Windows Vista');
     
     function GetWindowsVersion: TWindowsVersion;
     
        function ExportsAPI(module: HMODULE; const apiName: string): boolean;
        begin
          Result := GetProcAddress(module, PChar(apiName)) <> nil;
        end; { ExportsAPI }
     
      var
        hKernel32: HMODULE; // Windows.pas 
     
      begin { GetWindowsVersion }
        hKernel32 := GetModuleHandle('kernel32');
        Win32Check(hKernel32 <> 0);
        if ExportsAPI(hKernel32, 'GetLocaleInfoEx') then
          Result := wvWinVista
        else if ExportsAPI(hKernel32, 'GetLargePageMinimum') then
          Result := wvWinServer2003
        else if ExportsAPI(hKernel32, 'GetNativeSystemInfo') then
          Result := wvWinXP
        else if ExportsAPI(hKernel32, 'ReplaceFile') then
          Result := wvWin2000
        else if ExportsAPI(hKernel32, 'OpenThread') then
          Result := wvWinME
        else if ExportsAPI(hKernel32, 'GetThreadPriorityBoost') then
          Result := wvWinNT4
        else if ExportsAPI(hKernel32, 'IsDebuggerPresent') then  // aussi dans NT4!
          Result := wvWin98
        else if ExportsAPI(hKernel32, 'GetDiskFreeSpaceEx') then  // aussi dans NT4!
          Result := wvWin95OSR2
        else if ExportsAPI(hKernel32, 'ConnectNamedPipe') then
          Result := wvWinNT3
        else if ExportsAPI(hKernel32, 'Beep') then
          Result := wvWin95
        else // aucune idée
          Result := GetWindowsVersion;
      end. { GetWindowsVersion }

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      else // aucune idée de quoi il s'agit alors
        Result := GetWindowsVersion;
    Que mon SDK ne connait pas plus...
    Ben si je mets ça en commentaire, ça compile.
    Pas trop le temps de me pencher plus dessus, hélas...
    --
    jp

  6. #6
    Membre expérimenté
    Profil pro
    DEV
    Inscrit en
    Août 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DEV

    Informations forums :
    Inscription : Août 2006
    Messages : 182
    Par défaut
    essaie de remplacer ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      else // aucune idée de quoi il s'agit alors
        Result := GetWindowsVersion;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    else // aucune idée de quoi il s'agit alors
      Result := wvUnknown;
    Ca devrait mieu marcher je pense

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 120
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 120
    Par défaut
    Yep !

    + 1, DragonHeart,

    Maintenant, la grande question c'est : « comment qu'on utilise cette fonction ? ».
    Parce qu'un ShowMessage(GetTrueWindowsVersion); se fait bouler par le compilo (normal), et donc il faut convertir en string et je vois pas trop comment...
    Et même si je passe pour un boulet, je suis sûr qu'un newbie un jour ou l'autre posera la question, donc autant avoir la réponse,
    --
    jp

Discussions similaires

  1. [VB6] Obtenir la version du service pack
    Par GyLes dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 06/03/2006, 17h57
  2. Obtenir des droits Windows via une page ASP
    Par hysteresis dans le forum ASP
    Réponses: 2
    Dernier message: 31/08/2005, 10h31
  3. Version windows de PostGreSQL
    Par BONNEFOI Patrick dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 04/09/2003, 08h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo