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

Lazarus Pascal Discussion :

ExtractFilename et paramètres de ses chaînes


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut ExtractFilename et paramètres de ses chaînes
    Bonjour à tous,

    J'ai un problème sur lequel je galère pas mal.
    Je dois découper des strings pour en récupérer d'un côté le nom de fichier exécutable et de l'autre les paramètres.
    Ceci afin de les utiliser dans un TAsyncProcess.

    Les strings sont récupérées dans la base de registre, donc je n'ai pas le choix de leur mise en forme.

    Exemples de strings :

    "C:\Windows\SysWOW64\RunDll32.EXE" "C:\Program Files\NVIDIA Corporation\Installer2\InstallerCore\NVI2.DLL",UninstallPackage Display.Update
    C:\Program Files (x86)\DYMO\DYMO Label Software\Uninstall DYMO Label.exe
    MsiExec.exe /X{908DB568-E5FA-40C7-A2AA-AB340190858B}
    RunDll32 C:\Program Files (x86)\COMMON~1\INSTAL~1\PROFES~1\RunTime\11\50\Intel32\ctor.dll,LaunchSetup "C:\Program Files (x86)\InstallShield Installation Information\{40989F6C-18D8-4EE1-9B79-3D6FD2893EE9}\setup.exe" -l0x40c UNINSTALL -removeonly
    c:\Program Files (x86)\Common Files\Adobe AIR\Versions\1.0\Resources\Adobe AIR Updater.exe -arp:uninstall

    J'ai fait exprès de choisir les exemples qui me posent des problèmes.
    J'aimerais récupérer l’exécutable en bleu
    et les paramètres en rouge.
    J'ai farfouillé un peu partout et je n'ai rien trouvé de très probant.
    J'ai bien évidemment essayé les ExtractFileName ExtractFileDir etc. sans succès.

    Quelqu'un a déjà eu affaire à ce problème ???

    Merci et joyeux Noël ;-)

  2. #2
    Membre émérite
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Par défaut
    Bonjour

    Je pense que le plus simple est d'éclater chaque ligne de ton exemple dans une TStringList, puis récupérer le premier item et concaténer les autres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.FormShow(Sender: TObject);
    var
      Liste: TStringList;
    begin
      Liste := TStringList.Create;
      try
        Liste.Delimiter:= ' ';
        Liste.DelimitedText:= '"C:\Windows\SysWOW64\RunDll32.EXE" "C:\Program Files\NVIDIA Corporation\Installer2\InstallerCore\NVI2.DLL",UninstallPackage Display.Update';
      Memo1.Clear;
      Memo1.Lines.AddStrings( Liste );
      finally
        Liste.Free;
      end ;
    end;
    Ce qui affichera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    C:\Windows\SysWOW64\RunDll32.EXE
    C:\Program Files\NVIDIA Corporation\Installer2\InstallerCore\NVI2.DLL
    ,UninstallPackage
    Display.Update
    

  3. #3
    Membre confirmé
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut
    Oui c'est un peu ce que fait la procédure [CommandToList] du TProcess (unité C:\lazarus\fpc\3.0.4\source\packages\fcl-process\src\process.pp)
    Sauf que cela ne marche plus lorsqu'il y a des espaces dans le nom de fichier comme "c:\Program Files (x86)\Common Files\Adobe AIR\Versions\1.0\Resources\Adobe AIR Updater.exe -arp:uninstall" par exemple.
    Dans ce cas j'aurai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    c:\Program 
    Files 
    (x86)\Common 
    Files\Adobe 
    AIR\Versions\1.0\Resources\Adobe 
    AIR 
    Updater.exe 
    -arp:uninstall
    C'est sûrement pour cette raison que la Property CommandLine du TProcess est deprecated;

    J'ai pensé faire un peu la méme chose mais en decoupant le TStringList par des '\', ce qui donnerait pour l'exemple ci dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    c:
    Program Files (x86)
    Common Files
    Adobe AIR
    Versions
    1.0
    Resources
    Adobe AIR Updater.exe -arp:uninstall
    Dans ce cas on récupère le nom de l'exec+les params dans la dernière ligne.
    Et le path dans les lignes précédentes.

    La question c'est comment séparer le Nom de l'exe des paramètres en sachant qu'on peut avoir comme strings :
    • Uninstall DYMO Label.exe (Avec des espaces dans le nom de fichier)
    • MsiExec.exe /X{908DB568-E5FA-40C7-A2AA-AB340190858B}
    • msiexec /X{908DB568-E5FA-40C7-A2AA-AB340190858B} (Sans extension .exe)
    • Adobe AIR Updater.exe -arp:uninstall (avec des espaces et avec les parametres commencants par '-')


    Et là où ça devient de la folie, c'est quand il y a des '\' dans les paramètres comme :
    • RunDll32 C:\Program Files (x86)\COMMON~1\INSTAL~1\PROFES~1\RunTime\11\50\Intel32\ctor.dll,LaunchSetup "C:\Program Files (x86)\InstallShield Installation Information\{40989F6C-18D8-4EE1-9B79-3D6FD2893EE9}\setup.exe" -l0x40c UNINSTALL -removeonly

    Il n'y aurait pas une fonction Windows qui gérerait cette problématique ?

    Merci à ceux qui ont eu le courage de lire jusqu'ici...
    Et MERCI à ceux qui vont répondre ou apporter un début de réponse...

  4. #4
    Membre émérite
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Par défaut
    Sauf que cela ne marche plus lorsque il y a des espaces dans le nom de fichier comme "c:\Program Files (x86)\Common Files\Adobe AIR\Versions\1.0\Resources\Adobe AIR Updater.exe -arp:uninstall" par exemple.
    Ce n'est pas un vrai nom de fichier qui est entre quotes, puisqu'il y a -arp:uninstall à l'intérieurdes quotes.

    Le mieux serait effectivement de trouver la fonction de l'API Windows qui fasse le travail, qu'on peut sûrement appeler avec Lazarus, ou sinon connaître les règles précises, qu'on peut certainement implémenter avec Lazarus.

    Dans les deux cas ce n'est pas une problématique Lazarus, et je te suggère d'aller voir ou de questionner sur des forums Windows.

  5. #5
    Membre confirmé
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut
    Citation Envoyé par tintinux Voir le message
    Ce n'est pas un vrai nom de fichier qui est entre quotes, puisqu'il y a -arp:uninstall à l'intérieurdes quotes.
    Oui effectivement il n'y a pas de quotes autour de cette ligne de commande, je les ai mis pour que le texte soit plus lisible, cela peut porter a confusion, c'est de ma faute...

    La ligne de commande est bien : c:\Program Files (x86)\Common Files\Adobe AIR\Versions\1.0\Resources\Adobe AIR Updater.exe -arp:uninstall

  6. #6
    Membre émérite

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Par défaut
    J'ai bricolé ça vite fait mais sous Linux:
    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
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Full_Name, Dir_Name, File_Name, Ext_Name, Cmd_Name: String;
    begin
      Full_Name:='c:\Program Files (x86)\Common Files\Adobe AIR\Versions\1.0\Resources\Adobe AIR Updater.exe -arp:uninstall';
      Dir_Name:=ExtractFilePath(Full_Name);     //    ExtractFileDir(Full_Name) fonctionne aussi.
      File_Name:=ExtractFileName(Full_Name);    // Va récupérer le nom de fichier ET les paramètres.
      Ext_Name:=ExtractFileExt(Full_Name);      // Juste pour voir, ne sert à rien.
      Cmd_Name:=RightStr(Ext_Name,Length(Ext_Name)-4); // Récupérer les paramètres ( A modifier si plus de 3 caractères après le . )
      File_Name:=AnsiReplaceStr(File_Name,Cmd_Name,'');// Virer les paramètres du nom de fichier.
     
      ShowMessage('Chemin: '+Dir_Name+chr(10)+chr(10)+
                  'Fichier :'+File_Name+chr(10)+chr(10)+
                  'Extension & Cmd: '+Ext_Name+chr(10)+chr(10)+
                  'Commande: '+Cmd_Name);
    end;
    Le résultat est correct:
    Nom : file_name.jpg
Affichages : 705
Taille : 14,9 Ko
    Si vraiment la version windows de Lazarus ne digère pas les espaces il suffit de les remplacer par un caractère qu'on ne risque pas de trouver dans un nom de fichier ( < 32 ou 255 ) dans la chaîne originelle et de faire l'inverse une fois le traitement terminé.

    Note: Un truc bête et méchant: extractfilename renvoie bien le nom de fichier seul avec son extension mais extractfilenameonly le renvoie avec le chemin d'accès complet ce qui me semble un peu tartignole.

  7. #7
    Membre confirmé
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut AnsiExtractQuotedStr, la solution pour les lignes commençant par "
    (Je fais un nouveau message pour pas alourdir le précédent)
    J'ai trouvé une solution pour les lignes commençant par un "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure _ExtractFileAndParamsFromQuotted(const ACmd: string; var AExe, AParams: string);
      var
        pCmd: PChar;
      begin
        pCmd := PChar(ACmd);  // Parce que AnsiExtractQuotedStr(PChar(ACmd), '"') ne fonctionne pas, car le premier paramètre de la procédure est un var
        AExe := AnsiExtractQuotedStr(pCmd, '"'); //function AnsiExtractQuotedStr(var Src: PChar; Quote: Char): string; dans SysUtils
        AParams := trim(pCmd);
      end;
    Avec ACmd := '"C:\Windows\SysWOW64\RunDll32.EXE" "C:\Program Files\NVIDIA Corporation\Installer2\InstallerCore\NVI2.DLL",UninstallPackage Display.Update'
    on récupère AExe = C:\Windows\SysWOW64\RunDll32.EXE (Extraction du contenu du premier QuotedStr de ACmd)
    et AParams = "C:\Program Files\NVIDIA Corporation\Installer2\InstallerCore\NVI2.DLL",UninstallPackage Display.Update (soit ACmd - l'extraction ci-dessus)

    Voilà, un des problèmes de résolu...

Discussions similaires

  1. echec de la conversion de paramètre d'un string en int32
    Par sycoulibaly dans le forum VB.NET
    Réponses: 21
    Dernier message: 18/02/2009, 00h19
  2. DLL avec paramètres CString et String en .net
    Par basnifo dans le forum C++/CLI
    Réponses: 3
    Dernier message: 25/09/2008, 19h45
  3. Réponses: 7
    Dernier message: 29/10/2007, 14h03
  4. Réponses: 4
    Dernier message: 18/06/2007, 13h54
  5. Réponses: 3
    Dernier message: 04/06/2007, 09h31

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