Mega Code Archive

 
Categories / Delphi / Examples
 

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

Title: How to pass command line parameters from a started programm to an already running one? 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.