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

  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 124
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 124
    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 124
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 124
    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 124
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 124
    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

  8. #8
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    En définissant un tableau constant de chaînes de caractères par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const
      WinVersionStrings : array[TWindowsVersion] of string = (
        'Version inconnue', 'Windows 3.1', 'Windows 95', 'Windows 95 OSR 2',
        'Windows 98', 'Windows 98 SE', 'Windows Millenium', 'Windows 9x',
        'Windows NT 3', 'Windows NT 4', 'Windows 2000', 'Windows XP',
        'Windows NT', 'Windows Server 2003', 'Windows Vista'
      );
    Que tu utilises comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage(WinVersionStrings[GetWindowsVersion]);
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 124
    Par défaut
    Pas besoin de redéfinir un truc déjà défini, ça fonctionne impec comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage(CWindowsVersionStr[GetTrueWindowsVersion]);
    Merci à tous,
    --
    jp

  10. #10
    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
    CODE FINAL

    On y est enfin

    D'abord, voici la version finale corrigée (encore une fois!) (en effet une faute sur le dernier result- donc: Result := wvUnknown et oubli de l'implementation

    Voici:

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
    unit WinVersion;
     
    interface
    // {$IFDEF MSWindows}{$WARN SYMBOL_PLATFORM OFF}{$WARN UNIT_PLATFORM OFF}{$ENDIF MSWindows}
     
     
    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;
     
    implementation
     
     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 := wvUnknown;
      end;
      end. { GetWindowsVersion }
    On aura intérêt à utiliser cette unité (= fonction WinVersion) plutôt que l'habituelle fonction windows GetVersionEx pour identifier la vraie version de windows. Raison évidente : GetVersionEx retourne souvent des faussetés (il y a même une explication donnée sur msdn - voir *ici* (... Identifying the current operating system is usually not the best way to determine whether a particular operating system feature is present. This is because the operating system may have had new features added in a redistributable DLL. Rather than using GetVersionEx to determine the operating system platform or version number, test for the presence of the feature itself...)

    Donc, c'est le but de WinVersion qui justement teste pour la présence de fonctions API spécifiques qui distinguent les versions windows entre elles, de w95 à Vista.

    ------------

    USAGE: On ajoute l'unité WinVersion (Uses WinVersion) dans notre application et pour trouver la version windows on fait appel à la fonction, par exemple comme ceci (programme en mode console):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    program unit1;
     
    {$APPTYPE CONSOLE}
     
    uses
      Windows,
      SysUtils,
      WinVersion;
     
    begin
      Writeln('GetWindowsVersion: ', CWindowsVersionStr[GetWindowsVersion]);
      Readln;
    end.
    ----------------------------------

    Voilà qui devrait répondre aux interrogations lues plus haut.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 124
    Par défaut
    Yep !
    J'voudrais pas troller, mais je pense qu'il y a une 'tite confusion, là...
    On aura intérêt à utiliser cette unité (= fonction WinVersion) plutôt que l'habituelle fonction windows GetVersionEx pour identifier la vraie version de windows. Donc, c'est le but de WinVersion qui justement teste pour la présence de fonctions API spécifiques qui distinguent les versions windows entre elles, de w95 à Vista.
    J'ai suivi ton lien, j'ai tout bien lu, et je pense que ce que Kro$oft veut dire, c'est qu'il ne faut pas se fier à la version de l'OS pour savoir si une fonction d'une dll est présente ou non, car une dll plus récente avec la fonction incorporée pourrait être distribuée sur le système cible.
    Dit autrement, il s'agit en fait de tester une fonction, basée sur la présence de la fonction dans la dll plutôt que sur la version de l'OS.
    La version de l'OS se récupèrera quand même encore et toujours avec GetVersionEx (exemple).
    Ce qui n'enlève rien à la valeur de ton travail, mais faut juste remettre les choses à leur place,
    Mes 2 cts,
    --
    jp

  12. #12
    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
    Citation Envoyé par Jipété Voir le message
    Ce qui n'enlève rien à la valeur de ton travail
    +1
    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

  13. #13
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Pas besoin de redéfinir un truc déjà défini, ça fonctionne impec comme ça :
    Euh... Ouaip. Je vais me rendormir
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    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
    Citation Envoyé par Jipété Voir le message
    Yep !
    J'voudrais pas troller, mais je pense qu'il y a une 'tite confusion, là... J'ai suivi ton lien, j'ai tout bien lu, et je pense que ce que Kro$oft veut dire, c'est qu'il ne faut pas se fier à la version de l'OS pour savoir si une fonction d'une dll est présente ou non, car une dll plus récente avec la fonction incorporée pourrait être distribuée sur le système cible.
    Dit autrement, il s'agit en fait de tester une fonction, basée sur la présence de la fonction dans la dll plutôt que sur la version de l'OS.
    La version de l'OS se récupèrera quand même encore et toujours avec GetVersionEx (exemple).
    Ce qui n'enlève rien à la valeur de ton travail, mais faut juste remettre les choses à leur place,
    Mes 2 cts,
    --
    jp


    Le fait est que GetVersionEx donne parfois la mauvaise version, sans doute influencé par la présence de dll ajoutées ou autres updates. On a pu le vérifier. Avec Winversion on est certains de la version windows.

  15. #15
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065

  16. #16
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Encore merci de ce code très pratique

    Mais pour Seven, il commence à courir sur pattes, et il ne faut pas le négliger

    @+

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 124
    Par défaut
    Ah, tiens, Droïde !

    Alors, dans le même ordre d'idée, ne pas zapper non plus 'Windows Server 2008', qui est bien vivant, lui !

    J't'en serre cinq, 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