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
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
J'ai la solution. Je t'envoie cela tout à l'heure
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;
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
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
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
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
Difficile de comprendre vos messages
C'est le premier booléen
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;
Cela pour effet de bloquer A durant l'exécution de B
Code : Sélectionner tout - Visualiser dans une fenêtre à part OK := ExecuteProcess(FileName, Parameters, WorkingFolder, true, false, false, Error);
Si B est fermé, cela reprend l’exécution de A
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)
bonjour
encore merci je viens de comprendre
je ne sais plus comment faire pour mettre resolu
merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager