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 :

Exécuter une fonction Linux dans un programme Delphi


Sujet :

Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mars 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mars 2022
    Messages : 4
    Par défaut Exécuter une fonction Linux dans un programme Delphi
    Bonjour à tous,

    je suis à la recherche d'une possibilité d'effectuer certaines commandes Linux dans un programme Delphi. Par exemple la commande me permetant de supprimer tous les fichiers vieux de plus de 7 jours serait directement sous Ubuntu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /root/PAServer/scratch-dir/log -mtime +7 -delete
    La meme commande j'ai envie de l'appeler dans un programme Delphi qui va fonctionner sous Linux. Sous Windows on aurait simplement appelé un ShellExecute (ShellExecute(Handle, 'open', PChar(filePath+'Test.exe'), PChar(test_host+' '+test_host), nil, SW_SHOWNORMAL);).

    Merci pour votre attention.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 001
    Par défaut
    Ceci ressemble à votre demande Execute external program from Linux/Delphi 10.2 console application, je suppose que vous avez déjà exploré cette piste sans succès ?!

    Sinon la fonction _system de Posix.Stdlib
    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
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mars 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mars 2022
    Messages : 4
    Par défaut
    Bonjour,

    j'essaie d'adapter le programme sur votre liendepuis un bon bout à mon cas. J'ai pas encore trouvé la bonne solution.

  4. #4
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Je ne me souviens plus si "find" est une commande bash ou un programme.

    Dans le premier cas, faut appeler bash et la lui passer, dans le second directement exécuter la ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _system(PAnsiChar(AnsiString(commande)));
    avec la bonne unité devrait effectivement régler la question, comme sur Mac, mais attention à un point important : le chemin d'accès à "find" n'est peut-être pas connu, donc ne trouvant pas la commande, il ne fait rien. Mieux vaut spécifier le nom complet avec son chemin.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mars 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mars 2022
    Messages : 4
    Par défaut
    ce programme je l'ai déjà vu aussi, mais là on a à faire à une lecture de fichier si j'ai bien compris.

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mars 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mars 2022
    Messages : 4
    Par défaut
    c'est pas sous windows?


    Citation Envoyé par pprem Voir le message
    Je ne me souviens plus si "find" est une commande bash ou un programme.

    Dans le premier cas, faut appeler bash et la lui passer, dans le second directement exécuter la ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _system(PAnsiChar(AnsiString(commande)));
    avec la bonne unité devrait effectivement régler la question, comme sur Mac, mais attention à un point important : le chemin d'accès à "find" n'est peut-être pas connu, donc ne trouvant pas la commande, il ne fait rien. Mieux vaut spécifier le nom complet avec son chemin.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 001
    Par défaut
    Citation Envoyé par letoumbouc Voir le message
    ce programme je l'ai déjà vu aussi, mais là on a à faire à une lecture de fichier si j'ai bien compris.
    Vous n'avez pas compris, il s'agit de lancer la commande via un shell, le shell lit le contenu et l'execute, ensuite cela récupère la sortie de la console, l'équivalent d'un ReadPipe dans Windows.

    L'exemple dans chapmanworld.com a été amélioré dans le lien que j'ai fourni Execute external program from Linux/Delphi 10.2 console application, il faut aller à la fin pour avoir un code réutilisable dans un objet TLinuxUtils.



    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    unit LinuxUtils;
     
    interface
     
    uses
      System.SysUtils,
      System.Classes,
      Posix.Base,
      Posix.Fcntl;
     
    type
      TStreamHandle = pointer;
     
      TLinuxUtils = class
      public
        class function RunCommandLine(ACommand : string) : TStringList;overload;
        class function RunCommandLine(Acommand : string; Return : TProc<String>) : boolean; overload;
        class function findParameter(AParameter : string) : boolean;
      end;
     
     
     
      function popen(const command: MarshaledAString; const _type: MarshaledAString): TStreamHandle; cdecl; external libc name _PU + 'popen';
      function pclose(filehandle: TStreamHandle): int32; cdecl; external libc name _PU + 'pclose';
      function fgets(buffer: pointer; size: int32; Stream: TStreamHAndle): pointer; cdecl; external libc name _PU + 'fgets';
     
     
    implementation
     
    class function TLinuxUtils.RunCommandLine(ACommand : string) : TStringList;
    var
      Handle: TStreamHandle;
      Data: array[0..511] of uint8;
      M : TMarshaller;
     
    begin
      Result := TStringList.Create;
      try
        Handle := popen(M.AsAnsi(PWideChar(ACommand)).ToPointer,'r');
        try
          while fgets(@data[0],Sizeof(Data),Handle)<>nil do begin
            Result.Add(Copy(UTF8ToString(@Data[0]),1,UTF8ToString(@Data[0]).Length -1));//,sizeof(Data)));
          end;
        finally
          pclose(Handle);
        end;
      except
        on E: Exception do
          Result.Add(E.ClassName + ': ' + E.Message);
      end;
    end;
     
    class function TLinuxUtils.RunCommandLine(Acommand : string; Return : TProc<string>) : boolean;
    var
      Handle: TStreamHandle;
      Data: array[0..511] of uint8;
      M : TMarshaller;
     
    begin
      Result := false;
      try
        Handle := popen(M.AsAnsi(PWideChar(ACommand)).ToPointer,'r');
        try
          while fgets(@data[0],Sizeof(Data),Handle)<>nil do begin
            Return(Copy(UTF8ToString(@Data[0]),1,UTF8ToString(@Data[0]).Length -1));//,sizeof(Data)));
          end;
        finally
          pclose(Handle);
        end;
      except
        on E: Exception do
          Return(E.ClassName + ': ' + E.Message);
      end;
    end;
     
    class function TLinuxUtils.findParameter(AParameter : string) : boolean;
    var
      I : Integer;
    begin
      Result := false;
      for I := 0 to Pred(ParamCount) do
      begin
        Result := AParameter.ToUpper = ParamStr(i).ToUpper;
        if Result then
          Break;
      end;
    end;
     
    end.
    Citation Envoyé par letoumbouc Voir le message
    c'est pas sous windows?
    Lisez vous nos réponses ?

    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon la fonction _system de Posix.Stdlib
    Evidement pour faire un code mixte, il faut gérer ShellExecute() pour windows et _system() pour POSIX
    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

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/02/2020, 16h45
  2. Réponses: 2
    Dernier message: 18/09/2017, 10h23
  3. Réponses: 6
    Dernier message: 23/12/2015, 17h00
  4. Comment intégrer une image dans un programme Delphi
    Par DanCode dans le forum Débuter
    Réponses: 8
    Dernier message: 03/03/2010, 13h06
  5. Réponses: 2
    Dernier message: 24/06/2003, 20h31

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