Bonjour,
Comment je peux executer un projet delphi (.exe) avec des paramètres via une commade dos?
Merci
Version imprimable
Bonjour,
Comment je peux executer un projet delphi (.exe) avec des paramètres via une commade dos?
Merci
Qu'est-ce qui te pose problème ? Récupérer les paramètres dans ton appli Delphi ? Dans ce cas vois les routines ParamCount et ParamStr.
Ben alors si ton programme s'appelle MyProg.exe et qu'il est dans le répertoire C:\MyProgs\ tu ouvres une ligne de commande et tu fais :
Mais à mon avis j'ai pas compris la question :aie:Code:C:\MyProgs\>MyProg Param1 Param2
salut
peut etre veut il envoyer une ligne de commande par programmation
dans ce cas regarde du cote de shellexecute
@+ Phil
Est-ce quelqu'un sait comment récupérer la chaine de parametres ailleurs que dans OnCreate après le lancement.
L'appli est active, et on la relance...
J'ai essayé dans "Onactivate", ça marche pas... Ca ne le fait qu'au démarrage.
Ca doit etre un message windows que je ne connais pas.
salut
as tu essayer ça pour voir ce qui ce passe
les paramettres sont disponible dans toute l'applicationCode:
1
2
3
4
5
6
7
8 procedure TForm1.Button1Click(Sender: TObject) ; var j:integer; begin for j := 1 to ParamCount do ShowMessage(ParamStr(j)) ; end;
@+ Phil
Il s'agit donc de limiter l'application à une seule instance. (par mutex)
Les deux instances étant indépendantes l'une de l'autre, il n'est pas possible de rediriger automatiquement les nouveaux paramètres vers la première instance.
Tu dois gérer une communication inter process (ou IPC) et envoyer toi-même les nouveaux paramètres à l'ancienne instance. De simple SendMessage suffiront.
Ton application devra mémoriser les paramètres dans une structure qui sera initialisée soit par ParamStr (OnCreate), soit par les messages (WndProc).
Prevois aussi une procédure style Reload qui sera appelée dans le OnCreate ou en réponse à un message (qui sera le dernier envoyé depuis la deuxième instance avant le Halt) et qui rechargera tes données en fonction des nouveaux paramètres disponibles.
Voici un exemple pour de simples Switch. Dans le cas de paramètres string (ex. nom de fichier), il faudra utiliser WM_COPYDATA ou un fichier mappé.
J'utilise un Halt à la place d'un Application.Terminate pour éviter un flicker de la deuxième fiche ;)Code:
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
102
103
104 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private procedure Reload; protected procedure WndProc(var Message: TMessage); override; end; //Structure des paramètres (Remplie dans OnCreate ou WndProc) TParams = record Param1 :boolean; Param2 :boolean; end; var Form1 :TForm1; TonMutex :THandle; Params :TParams; //Je préfère utilisé des RegisterWindowMessage mais //des WM_USER+n iraient aussi et permettraient un case of //dans WndProc ! WM_Param1 :integer; //Paramètre 1 WM_Param2 :integer; //Paramètre 2 WM_ParamReload :integer; //Prise en compte des nouveaux paramètres implementation {$R *.dfm} //Redirection des paramètres sur la première instance procedure RedirectParams; var Wnd :THandle; begin Wnd := FindWindow(nil, 'TitreDeTaFiche'); if Wnd <> 0 then begin //WParam contient l'état du switch (Présent ou non) SendMessage(Wnd, WM_Param1, integer(FindCmdLineSwitch('Param1')), 0); SendMessage(Wnd, WM_Param2, integer(FindCmdLineSwitch('Param2')), 0); SendMessage(Wnd, WM_ParamReload, 0, 0); end; end; { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin //Initialisation de la première instance Params.Param1 := FindCmdLineSwitch('Param1'); Params.Param2 := FindCmdLineSwitch('Param2'); Reload; end; procedure TForm1.Reload; begin //Traitement en fonction des paramètres end; //Surcharge de WndProc pour la récupération des nouveaux //paramètres envoyés depuis la deuxième instance procedure TForm1.WndProc(var Message: TMessage); begin if Message.Msg = WM_Param1 then Params.Param1 := boolean(Message.WParam) else if Message.Msg = WM_Param2 then Params.Param2 := boolean(Message.WParam) else if Message.Msg = WM_ParamReload then Reload else inherited; end; initialization //Création des messages uniques Windows WM_Param1 := RegisterWindowMessage('WM_Param1'); WM_Param2 := RegisterWindowMessage('WM_Param2'); WM_ParamReload := RegisterWindowMessage('WM_ParamReload'); //Application déjà en exécution?... if (OpenMutex(MUTEX_ALL_ACCESS, TRUE, 'TonMutex') <> 0) then begin RedirectParams; Halt; end //...non else TonMutex := CreateMutex(nil, FALSE, 'TonMutex'); Finalization CloseHandle(TonMutex); end.
Bonjour voici cette exemple déjà cite qui te permet de récupérer les paramètre de la line de commande mais tu dois d’abord lui associer une extension et permets aussi l’ouverture des fichier par dragover