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

Delphi Discussion :

Problème avec la récupération de la version d'un bpl ?


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Problème avec la récupération de la version d'un bpl ?
    Bonjour,

    J'utilise la fonction suivante de la FAQ :
    http://www.developpez.com/delphi/faq...icationversion

    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
     
    function ApplicationVersion(Path:string):string;
    var
         VerInfoSize, VerValueSize, Dummy: DWord;
         VerInfo: Pointer;
         VerValue: PVSFixedFileInfo;
    begin
         VerInfoSize := GetFileVersionInfoSize(PChar(Path), Dummy);
         if VerInfoSize <> 0 then
         begin
              GetMem(VerInfo, VerInfoSize);
              GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
              VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
              with VerValue^ do
              begin
                   Result := IntTostr(dwFileVersionMS shr 16);
                   Result := Result + '.' + IntTostr(dwFileVersionMS and $FFFF);
                   Result := Result + '.' + IntTostr(dwFileVersionLS shr 16);
                   Result := Result + '.' + IntTostr(dwFileVersionLS and $FFFF);
              end;
              FreeMem(VerInfo, VerInfoSize);
         end
         else
              raise EAccessViolation.Create('Les informations de version de sont pas inclues');
    end;
    Le problème, c'est qu'il me renvoi des valeurs hasardeuses :
    35587.32466.16523.50114
    Comment récupérer la version d'un bpl de manière correcte ?

    => Elle fonctionne correctement avec mon module principal en .exe

    Cordialement,
    ZiP

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Les histoires de pointeurs ?

    Essaye cette fonction, j'ai eu parfois des soucis de cohérence des valeurs ... et donc j'ai cherche un peu ... ce code est traduit d'un code c++

    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
    70
    71
    72
    73
    74
    75
    76
    77
    function GetFileVersion(const NameExe: string; out Version: string): boolean;
    var
       dwVerSize : Integer; // Taille de la structure des données de version de ce fichier
       hMem : HGLOBAL; // Memoire Alloué
       LpData : LPSTR; // Buffer sécurisé
       dwVerHandle : LongWord; // C'est une valeur interne à GetFileVersionInfo...
       nStrLong : LongWord; // Longueur des Données
       ChaineCC : string; // Chaine temporaire de Format de la fonction VerQueryValue
       Lp : Pointer; // Pointeur sur Buffer si les données sont complètes
       cStartBuf : array[0..4] of char;
       cResBuf : array[0..255] of char; // Chaine de Format de la fonction VerQueryValue
       FileInfo : PVSFixedFileInfo;
     
       function GetStringVersion(): Boolean;
       begin
         // Traduit LpData dans FileInfo
         Result := VerQueryValue(LpData, '\', Pointer(FileInfo), nStrLong);
         if Result then begin
            // Pour comprendre ce Formatage, il fau comprendre la structure Packed PVSFixedFileInfo (Windows.pas)
            Version := Format('%d.%d.%d.%d', [ FileInfo.dwFileVersionMS shr 16,
                                             FileInfo.dwFileVersionMS and $FFFF,
                                             FileInfo.dwFileVersionLS shr 16,
                                             FileInfo.dwFileVersionLS and $FFFF]);
         end;
       end;
     
    begin
         Result := False;
         // Récupère la Taille de la structure des données de version de ce fichier
         dwVerSize := GetFileVersionInfoSize(PChar(NameExe), dwVerHandle);
         Version := 'Non Disponible';
         if dwVerSize = 0 then
            Exit;
     
         // Allocation de la mémoire avec un petit surplus
         hMem:= GlobalAlloc(GMEM_ZEROINIT, dwVerSize + 100);
         // Fourni un pointeur "non relatif" de la mémoire allouée qui ne peut pas être déplacé par les optimisations de Windows
         LpData:= GlobalLock(hMem);
         try
            // Retourne dans le buffer LpData les données de version de NameExe
            GetFileVersionInfo(PChar(NameExe), dwVerHandle, dwVerSize, LpData);
            // Détermine les paramètres régionaux sont spécifiques
            if not VerQueryValue(LpData,'\VarFileInfo\Translation', Lp, nStrLong) then begin
               if GetStringVersion() then
                  Exit;
            end;
            // Le format de la version est standard Delphi
            try
               // Copie une chaîne Pascal dans une chaîne terminée par le caractère Null.
               StrPcopy(cStartBuf, PChar(Lp));
               // Pour comprendre ce Formatage, il fau comprendre la structure Packed PVSFixedFileInfo (Windows.pas)
               ChaineCC := Format('\StringFileInfo\%.2x%.2x%.2x%.2x\', [byte(cStartBuf[1]),
                                                                       byte(cStartBuf[0]),
                                                                       byte(cStartBuf[3]),
                                                                       byte(cStartBuf[2])]);
            except
                  Exit;
            end;
     
            // Traduit Lp dans FileInfo selon la Chaine de Format de la fonction VerQueryValue cResBuf
            StrCopy(cResBuf, Pchar(ChaineCC + 'FileVersion'));
            if VerQueryValue(LpData, cResBuf, Lp, nStrLong) then begin
               StrPcopy(cResBuf,PChar(Lp));
               // C'est pour le cas si on veut le Copyright StrPas(cResBuf);
               Version := StrPas(cResBuf);
               Result := True;
            end;
     
            // Il n'est pas possible d'utiliser le format régional donc je reprends la méthode normale
            if not result then begin
               Result := GetStringVersion();
            end;
         finally
                GlobalUnLock(hMem);
                GlobalFree(hmem);
         end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    En effet, ça marche mieux

    Merci ^^
    ZiP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/01/2011, 09h01
  2. Problème avec mon nouveau PC HP version Windows 7
    Par haby86 dans le forum Windows 7
    Réponses: 8
    Dernier message: 29/10/2010, 10h07
  3. [MySQL] Problème avec la récupération des bbcodes
    Par runcafre91 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 18/02/2010, 07h15
  4. Réponses: 2
    Dernier message: 20/10/2008, 11h48
  5. [MySQL] problème avec la récupération des valeurs des variables POST
    Par Jasmine80 dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 11/05/2007, 16h08

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