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

Outils Delphi Discussion :

[Inno Setup] Lire un fichier .inf


Sujet :

Outils Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut [Inno Setup] Lire un fichier .inf
    Bonjour,

    Je souhaite lire un fichier .inf qui n'est pas structuré comme un ini, il n'a pas de section.

    Je voudrais récupérer la version pour autoriser ou non l'installation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    Version=1.2.3.4
    ...

    Merci

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    il suffit de le charger dans un TStringList et de chercher la valeur associée à la chaîne clef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyStringList.LoadFromFile('test.inf');
    MyVersion:=MyStringList.Values[ 'Version' ];
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 948
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    il suffit de le charger dans un TStringList et de chercher la valeur associée à la chaîne clef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyStringList.LoadFromFile('test.inf');
    MyVersion:=MyStringList.Values[ 'Version' ];
    La propriété Values n'est malheureusement pas disponible sous IS. La "cause" est à chercher dans RemObjects. Cette librairie fournit l'interpréteur mais ne met aucune classe originale à disposition. La logique est là, mais pas les déclarations !

    Les classes incluses dans IS telles que nous les connaissons sous Delphi ont en fait été entièrement réécrites : les structures recréés, les propriétés et méthodes redéfinies et assignées par pointeur sur les allocations faites effectivement par IS lui-même. Bref de quoi donner l'illusion qu'on travaille en Delphi ! Un gros boulot (ceux qui ont déjà intégré RemObjects dans un de leurs outils le savent) !

    @Sparktacus: Pas le choix si ce n'est de charger le fichier et de le décoder à la pogne !
    Maintenant ne pas oublier qu'il est très facile d'intégrer une DLL "maison" créée dans le langage de notre choix et de la lier à notre script. Cela reste la façon la plus facile, la plus rapide et la plus intuitive de palier aux manques IS

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    Merci bien pour vos informations.

    Bon but était simplement d'éviter des boulettes venant de l'utilisateur.
    Je ne suis pas en mesure de toucher au fichier, ce n'est pas moi qui le crée (bien que je le remplace mais par simple écrasement).

    Créer une dll maison serait surement une très bonne solution, pour un programmeur, ce que je ne suis pas.

    Et la réponse qui a été donné dans le sujet que j'ai linké ? Il n'y a pas moyen d'exploiter quelque chose ?

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 948
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Citation Envoyé par Sparktacus Voir le message
    Et la réponse qui a été donné dans le sujet que j'ai linké ? Il n'y a pas moyen d'exploiter quelque chose ?
    Ben si ! La fonction GetKeyValue correspond exactement à ton besoin.

    ps: Il faudrait juste remplacer if KeyPos > 0 then par if KeyPos = 1 then.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    Ba oui, mais non ! Si j'avais compris sa réponse j'aurais juste eu à la mettre en pratique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L2Ver2.Caption := GetKeyValue('PatchVersion', FilePath, 'N/A');
    Késako Caption . L2Ver2.Caption ne semble pas être une variable contenant la valeur. Et je ne comprends pas non plus tous le reste du code qui suit la ligne que j'ai citée, surtout la partie procedure InitializeWizard.


  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    Le code en question reproduit la recherche des clés 'name=Value' dans un fichier de style ini sans sections.

    Le résultat renvoyé par la fonction est donc une chaîne, logée dans l'exemple dans le titre (Caption) d'un Label (L2Ver2).

    Il suffit de tester directement la valeur retournée ou de la loger dans la variable chaîne qu'il te plaira :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if GetKeyValue('Version', 'Monfichier.inf', 'valeur par défaut')<=versionActuelle then Exit;
    // ou
    VersionDuFichier := GetKeyValue('Version', 'Monfichier.inf', 'valeur par défaut');
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    VersionDuFichier ne contiens rien du tout ... ou plutôt ce que j'ai mis en valeur par défaut dans le meilleur des cas. Et le chemin vers le fichier inf est bon.

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 948
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Citation Envoyé par Sparktacus Voir le message
    Et le chemin vers le fichier inf est bon.
    Manifestement pas !
    Et si tu nous montrais comment tu appelles cette fonction

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    Comme tourlourou le suggère. A ceci prêt que je spécifie via une variable string, pour le test, un chemin complet vers le fichier.

    Y'a pas que ca dans mon script mais je vais essayer de n'afficher ici que ce qui nous intéresse en essayant de ne pas y glisser d'erreurs.


    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
     
    function GetKeyValue(const AKeyName, AFileName, ADefault: string): string;
    var  
      I: Integer;
      KeyPos: Integer;
      KeyFull: string;
      FileLines: TArrayOfString;
    begin
      Result := ADefault;
      if LoadStringsFromFile(AFileName, FileLines) then
      begin
        KeyFull := AKeyName + '=';
        for I := 0 to GetArrayLength(FileLines) - 1 do
        begin
          FileLines[I] := TrimLeft(FileLines[I]);
          KeyPos := Pos(KeyFull, FileLines[I]);
          if KeyPos = 1 then 
          begin
            Result := Copy(FileLines[I], KeyPos + Length(AKeyName) + 1, MaxInt);
            Break;
          end;
        end;
      end;
    end;
     
    var
      FilePath: string;
      VersionDuFichier: string;
      MessageErreur : string;
      MessageErreurVersion : string;
     
    Function NextButtonClick(CurPageID: Integer): Boolean;
    Begin
      Result:= True; // Valeur de retour par défaut
      if (CurPageID = wpSelectDir) then
      begin
        // assign the expected INF file path
        FilePath := 'C:\Program Files (x86)\nomProgramme\fichier.inf';
        // read the PatchVersion key value, return N/A if not found
        VersionDuFichier := GetKeyValue('PatchVersion', 'FilePath', 'N/A');
        if (CurPageID = wpSelectDir) then
        begin
          if VersionDuFichier <> '5.3.1.6' then
          Begin
            MessageErreurVersion := 'Version de programme invalide ' + VersionDuFichier;
            Msgbox(MessageErreurVersion, mbConfirmation, MB_Ok);
            Result:=False;
          End;
        end;
      end;
    end;
    La pop d'erreur m'affiche :
    Version de programme invalide N/A

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 948
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Mauvaise idée de passer un chemin en dur. Laisse faire IS, il sait gérer les redirections 32/64 bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FilePath := ExpandConstant('{pf}\nomProgramme\fichier.inf');
    Si nomProgramme est ton application et puisque tu laisses le choix à l'utilisateur de l'installer dans un répertoire différent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FilePath := ExpandConstant('{app}\fichier.inf');
    Mais wpSelectDir est trop tôt pour le test puisque c'est sur cette page que l'utilisateur peut changer le chemin !

    Enfin bien sûr passer ce répertoire/fichier correctement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VersionDuFichier := GetKeyValue('PatchVersion', FilePath, 'N/A');

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    Bon sang, fichu quote. C'est toujours les erreurs les plus simple qui nous échappe le plus.

    Merci

    Comme je l'ai dis c'est juste pour tester mon script. Maintenant qu'il fonctionne je vais mettre un chemin relatif, et si ça ne marche pas je sais que ca viendra de mon chemin ...

    En effet c'est trop tôt, si on change le répertoire VersionDuFichier n'est pas actualisé. Donc .... ba je sais pas

    Je suis quand même très surpris de voir que comparer la grandeur de deux valeurs qui ne sont ni des entier ni des float ne provoque pas d'erreur et en ça plus fonctionne.
    Je suis septique. Je n'ai pas vraiment confiance avec > ou <. Je crois que je vais rester sur des tests d'égalité ou de différence.

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 948
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    Citation Envoyé par Sparktacus Voir le message
    En effet c'est trop tôt, si on change le répertoire VersionDuFichier n'est pas actualisé. Donc .... ba je sais pas
    wpSelectComponents, wpReady, etc. tu as le choix.
    N'importe quelle page qui suit la sélection du répertoire. Regarde les constantes en bas de cette page.

    ps: si ce n'est qu'une mise à jour (un patch), l'utilisateur ne devrait pas pouvoir modifier le chemin

    Citation Envoyé par Sparktacus Voir le message
    Je suis quand même très surpris de voir que comparer la grandeur de deux valeurs qui ne sont ni des entier ni des float ne provoque pas d'erreur et en ça plus fonctionne.
    Je suis septique. Je n'ai pas vraiment confiance avec > ou <. Je crois que je vais rester sur des tests d'égalité ou de différence.
    Dans le cas d'une chaîne, les caractères (leurs codes ANSI) sont comparés un à un. Ça fonctionne parce que tu testes une version précise (égale à) mais ne fonctionnera pas (ou mal) sur un "plus grand que", 5.11 ayant un poids inférieur à 5.3
    Il faut décortiquer la chaîne et contrôler chaque nombre.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    En fait ca va bien là où c'est, c'est à l’évènement Next clique que l'installateur dit si oui ou non la version est bonne, si on spécifie un autre répertoire ca recheck au prochain clique.

    Le problème étrange que j'ai c'est que si j'indique un autre dossier, l'installateur va prendre le dossier choisie et ajouter à la suite la valeur de DefaultDirName={pf}Donc si je choisi manuellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Program Files (x86)\AAAAA
    Ca va mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Program Files (x86)\AAAAA\Program Files (x86)



    Autre problème, si j'utilise ExpandConstant('{app}') pour indiquer en relatif le lieu de mon .inf j'ai un message d'erreur alors que partout ailleurs où je me sert de cette constant je n'ai pas de problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception: Erreur interne : An attempt was made to expand the "app" constant before it was initialized.
    Je n'ai pas encore creusé les problèmes.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    Voici les nouvelles

    Le problème de la cumulation du dossier d'installation choisi manuellement + celui par défaut je ne suis pas le seul à l'avoir. La solution la plus simple serait de mettre

    UsePreviousAppDir=No

    C'est bien dans le cas d'une première installation mais dans mon cas je ne veux pas le mettre à No.

    Autre possibilité faire un hack d'après ce sujet. Mais le bidouillage, passer 4 heures pour des broutille ça commence à me courir sur le haricot, alors ça restera comme ça. Pour les curieux il y a aussi la solution de ouiouioui.

    Pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception: Erreur interne : An attempt was made to expand the "app" constant before it was initialized.
    Je sèche. j'ai oublié de dire que l'erreur ne survient pas à la compilation mais dès le 1er clique sur suivant lors de l'installation. Je ne comprend vraiment pas vu que j'utilise cette constante à peine quelques ligne plus haut (à l'intérieur de la fonction NextButtonClick)pour tester la présence d'un fichier ...
    Edit : je viens d'avoir une illumination en relisant ma phrase, enfin je crois, j'y réfléchi...
    Edit2 : voilà après le haha j'ai repositionné la définition de la variable après la condition if (CurPageID = wpSelectDir) then plutôt que juste au dessus ... en effet l’événement du 1er clique intervenait avant la définition de {app}

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 948
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 948
    Par défaut
    {app} : cette variable n'est pas encore initialisée. Tu essayes de l'utiliser trop tôt (InitializeSetup, InitializeWizard ?)

    Peut-être y a-t-il un problème dans IS si tu choisis DefaultDirName={pf} mais c'est d'un illogisme total ! Passe-lui DefaultDirName={pf}\AAAAA bon sang !

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Passe-lui DefaultDirName={pf}\AAAAA bon sang !
    C'est ce que je fais t'inquiète, j'ai juste supprimé le dossier "pour voir" comment allait réagir Inno Setup (si AAAAA ni est plus, comment pourra-t-il se répéter ? Et bien c'est Program Files (x86) qui se répète à la place).

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 69
    Par défaut
    En tous cas énorme merci pour l'aide apporté.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2009, 11h35
  2. Inno Setup: Installer certains fichiers suivant le choix de l'utilisateur
    Par remfleyf dans le forum Installation, Déploiement et Sécurité
    Réponses: 3
    Dernier message: 17/12/2008, 10h55
  3. [Inno Setup] Renommer un fichier durant l'install
    Par freud dans le forum Outils
    Réponses: 2
    Dernier message: 17/09/2008, 21h49
  4. [Inno Setup][VISTA] et fichiers INI
    Par Droïde Système7 dans le forum Outils
    Réponses: 23
    Dernier message: 21/04/2008, 14h47
  5. [Inno Setup] Lire valeur edit.text
    Par karitoo dans le forum Outils
    Réponses: 2
    Dernier message: 17/10/2007, 12h25

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