...pass command line parameters from a started programm to an already running one?
Author: Loïs Bégué
{+++++++++++++++++++++ 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.
printed from
www.swissdelphicenter.ch
developers knowledge base