Mega Code Archive

 
Categories / Delphi / System
 

Pass command line parameters from a started programm to an already running one

{+++++++++++++++++++++ English +++++++++++++++++++++++++++++++++++++++++++++ You can control the start of your program and: 1) disallow a second start 2) call the already running application and make it active 3) send the "new" command line parameters to it ++++++++++++++++++++++ Deutsch +++++++++++++++++++++++++++++++++++++++++++++ Sie kontrollieren den Programmstart und: 1) verhindern, daß eine zweite Instanz gestartet wird 2) aktivieren die erste Instanz 3) übergeben die neuen Kommandozeilenparameter an dieser Instanz ++++++++++++++++++++++ Français ++++++++++++++++++++++++++++++++++++++++++++ Vpous controllez le démarage du programme et: 1) empêchez une deuxième instance 2) activez la première instance 3) passez les paramêtres au démarrage de la 2ème vers la 1ère instance ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++} {####################### MAIN PROG FILE #####################################} Programm Number_5; //... const cMutexID = 'Number_5_is_alive'; var Mutex: THandle; HAPPLICATION: HWND; HMAINFORM: HWND; StartParams: string; AnzahlParams: Integer; AtomSend: Integer; begin Mutex := CreateMutex(nil, True, cMutexID); // +++ identify an already running app +++ if (Mutex <> 0) and (GetLastError = 0) then begin // +++ none was found, so proceed as usual +++ Application.Initialize; Application.Title := 'Number 5 is alive'; Application.CreateForm(TMF_Number5, MF); Application.Run; if (Mutex <> 0) then CloseHandle(Mutex); end else begin // +++ look for the running app windows handle +++ HAPPLICATION := 0; HMAINFORM := 0; Application.Initialize; repeat HAPPLICATION := FindWindowEx(0,HAPPLICATION, 'TApplication', PChar('Number 5 is alive')); until HAPPLICATION <> Application.Handle; // +++ found it, so activate the running app and proceed with the parameters +++ if HAPPLICATION <> 0 then begin Windows.ShowWindow(HAPPLICATION, SW_Normal); Windows.SetForegroundWindow(HAPPLICATION); // +++ look for the Form handle, wich will be used as a target of the message +++ HMAINFORM := FindWindowEx(0,0,'TMF_Number5', nil); if (HMAINFORM <> 0) then begin StartParams := ''; // +++ code your parameters +++ for AnzahlParams := 1 to ParamCount do StartParams := StartParams + ' ' + ParamStr(AnzahlParams); try // +++ Send the parameter info +++ AtomSend := GlobalAddAtom(PChar(StartParams)); SendMessage(HMAINFORM, WM_ACTIVATENumber5, Length(StartParams), AtomSend); finally GlobalDeleteAtom(AtomSend); end; end; end; // all is done: parameters had been sent so we can quit safelly Halt; end; end. {####################### FORM WITH MESSAGE HANDLING ROUTINE #################} unit MFU; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...; const WM_ACTIVATENumber5 = WM_USER + 101; type TMF_Number5 = class(TForm) procedure FormShow(Sender: TObject); procedure WMACTIVATENumber5(var Msg: TMessage); message WM_ACTIVATENumber5; private { Private-Deklarationen } public { Public-Deklarationen } end; var MF: TMF_Number5; implementation {$R *.dfm} procedure TMF_Number5.FormShow(Sender: TObject); begin // +++ the app was normaly started: parameters are maybe pending in the command line buffer +++ if ParamCount > 0 then begin // +++ Handle with this parameters.... +++ end; end; procedure TMF_Number5.WMACTIVATENumber5(var Msg: TMessage); var Buffer: PChar; S: string; begin // +++ the app was "reactivated": the command line cannot be used thru "ParamStr(..)" yet +++ try // +++ get the length of the "command line message" +++ Buffer := StrAlloc(Msg.wParam + 1); // +++ hold its value +++ GlobalGetAtomName(Msg.lParam, Buffer, Msg.wParam + 1); S := StrPas(Buffer); // +++ Analyse S and handle with parameters at will.... +++ finally StrDispose(Buffer); end; end; end.