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 :

lancement application externe


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 222
    Points : 55
    Points
    55
    Par défaut lancement application externe
    Bonjour
    je voudrais lancer un programme externe depuis Delphi (exemple.exe )
    mais que ce programme ne se ferme que de mon application qui a ouvert cette exe
    merci de votre aide

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    J'ai la solution. Je t'envoie cela tout à l'heure

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 222
    Points : 55
    Points
    55
    Par défaut
    bonjour
    merci d'avance

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Compilé avec XE10 et avec un peu de retard
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    unit ex01a;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      aPID: Dword;
     
    implementation
     
    {$R *.dfm}
     
    function ExecuteProcess(const FileName, Params: string; Folder: string;
      WaitUntilTerminated, WaitUntilIdle, RunMinimized: boolean;
      var ErrorCode: integer): boolean;
    var
      CmdLine: string;
      WorkingDirP: PChar;
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
     
    begin
      Result := true;
      CmdLine := '"' + FileName + '" ' + Params;
      if Folder = '' then
        Folder := ExcludeTrailingPathDelimiter(ExtractFilePath(FileName));
      ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
      StartupInfo.cb := SizeOf(StartupInfo);
      if RunMinimized then
      begin
        StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
        StartupInfo.wShowWindow := SW_SHOWMINIMIZED;
      end;
      if Folder <> '' then
        WorkingDirP := PChar(Folder)
      else
        WorkingDirP := nil;
      if not CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0, nil,
        WorkingDirP, StartupInfo, ProcessInfo) then
      begin
        Result := false;
        ErrorCode := GetLastError;
        exit;
      end;
      with ProcessInfo do
      begin
        aPID := GetProcessId(hProcess);
        CloseHandle(hThread);
        if WaitUntilIdle then
          WaitForInputIdle(hProcess, INFINITE);
        if WaitUntilTerminated then
          repeat
            Application.ProcessMessages;
          until MsgWaitForMultipleObjects(1, hProcess, false, INFINITE, QS_ALLINPUT)
            <> WAIT_OBJECT_0 + 1;
        CloseHandle(hProcess);
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      FileName, Parameters, WorkingFolder: string;
      Error: integer;
      OK: boolean;
    begin
      FileName := 'C:\Temp\TEST\ex01.exe';
      WorkingFolder := ''; // if empty function will extract path from FileName
      Parameters := '-p'; // can be empty
      OK := ExecuteProcess(FileName, Parameters, WorkingFolder, false, false,
        false, Error);
      if not OK then
        ShowMessage('Error: ' + IntToStr(Error));
     
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      h: THandle;
    begin
      h := OpenProcess(PROCESS_TERMINATE, false, aPID);
      TerminateProcess(h, 1);
      CloseHandle(h);
    end;

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par tintin62 Voir le message
    je voudrais lancer un programme externe et ne se ferme que de mon application qui a ouvert cette exe
    En résumant votre propos étrangement formulé
    Nous comprenons que vous avez un programme A et B
    Vous souhaitez que A lance B mais que B ne puisse être fermé qu'à la demande A
    Autant lancer B depuis A est d'une simplicité totale (cf l'encapsultion de CreateProcess ci-dessus ou alors les nombreux exemples dans la FAQ)
    Autant empêcher la fermeture de B par un tiers peut être difficile selon le type de programme et le niveau de l'utilisateur

    Est-ce bien cela ?
    Si oui
    Jusqu'à où souhaitez-vous sécuriser la fermeture de B ?
    Juste une protection niveau IHM, empêcher un WM_CLOSE, empêcher un TerminateProcess (voir si les Token peuvent aider)
    B, en avez-vous les sources ?

    On voit cela pour les antivirus, qui arrive très bien à se maintenir ouvert via plusieurs processus qui se maintiennent mutuellement en vie


    Si non
    Expliquez-vous

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 222
    Points : 55
    Points
    55
    Par défaut
    bonjour
    le programme B ce n'est pas moi qui la créer
    donc peu pas insérer un code pour le lancer avant
    je vais essayer la méthode de AL weber
    je vous tiens au courant
    merci

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 222
    Points : 55
    Points
    55
    Par défaut
    bonjour
    viens de faire un essai avec le code AL weber
    j'ai remplace le exe par notepad.exe pour essai
    sa le lance mais j'arrive a le fermer sans utiliser
    le bouton 2 et moi je veut interdire la fermeture ou me signaler
    qu'il est fermé( qu'on as fermé exemple notepad et retour a mon programme)

    merci

  8. #8
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 504
    Points : 2 776
    Points
    2 776
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par tintin62 Voir le message
    bonjour
    moi je veut .. me signaler
    qu'il est fermé( qu'on as fermé exemple notepad et retour a mon programme)

    merci
    Tu as déjà le code dans ce que je t'ai envoyé
    voir WaitUntilTerminated

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 222
    Points : 55
    Points
    55
    Par défaut
    Bnjour

    je vois comment WaitUntilTerminated est a true
    en mettant une variable dans la fonction ?
    ou
    quand dans mon programme avec un appui de bouton
    si le programme B n'est pas fermé il ne fait rien

    merci

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Difficile de comprendre vos messages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function ExecuteProcess(const FileName, Params: string; Folder: string; WaitUntilTerminated, WaitUntilIdle, RunMinimized: boolean; var ErrorCode: integer): boolean;
    C'est le premier booléen
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OK := ExecuteProcess(FileName, Parameters, WorkingFolder, true, false, false, Error);
    Cela pour effet de bloquer A durant l'exécution de B
    Si B est fermé, cela reprend l’exécution de A

    Citation Envoyé par ShaiLeTroll Voir le message
    Jusqu'à où souhaitez-vous sécuriser la fermeture de B ?
    Juste une protection niveau IHM, empêcher un WM_CLOSE, empêcher un TerminateProcess (voir si les Token peuvent aider)
    Vous n'avez pas répondu aux questions !
    Si B est un écran utilisateur, il faudrait voir avec les API comme SetWindowLong si vous pouvez changer le style de la fenêtre affiché par B pour retirer le bouton Croix
    Ensuite, plus votre utilisateur sera bon en informatique plus l'empêcher de fermer une application sera difficile (encore plus si vous n'en avez pas les sources)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 222
    Points : 55
    Points
    55
    Par défaut
    bonjour
    encore merci je viens de comprendre

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 222
    Points : 55
    Points
    55
    Par défaut
    je ne sais plus comment faire pour mettre resolu
    merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/10/2017, 16h07
  2. [D2010]Problème lancement application externe
    Par tokazio dans le forum Langage
    Réponses: 7
    Dernier message: 28/08/2012, 15h13
  3. Lancement application externe (autres que .exe)
    Par Pierre.B dans le forum Général Java
    Réponses: 9
    Dernier message: 02/07/2009, 11h22
  4. Problème lancement d'une application externe
    Par cl@ndestIno dans le forum C#
    Réponses: 3
    Dernier message: 19/02/2009, 17h51
  5. [VB6] Lancement d'une application externe
    Par ahouba dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 31/05/2006, 15h42

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