02. august 2006 - 11:06
#1
Hej Smith1,
Koden du henviser til virker nok? Jeg har tjekket med Delphi3, og der er nogle småting der skal justeres før det virker. Du kan indlæse nedenstående i hhv proj.source og unit.
(Har fjernet Mutex, og så iøvrigt brugt den overførte streng til noget - caption, og så skal program og unit naturligvis lige hedde Number_5 og mfu)
mvh
Anders
I projectsourcen:
program Number_5;
uses
Forms, windows,
mfu in 'mfu.pas' {mf_number5};
{$R *.RES}
//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, 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;
Halt;
end
// all is done: parameters had been sent so we can quit safelly
ELSE
BEGIN
Application.Title := 'Number 5 is alive';
Application.CreateForm(TMF_NUMBER5, MF);
Application.Run;
END;
// end;
end.
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);
private
{ Private-Deklarationen }
// a_nor flyttet hertil :
procedure WMACTIVATENumber5(var Msg: TMessage); message WM_ACTIVATENumber5;
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);
//a_nor:
CAPTION := s;
// +++ Analyse S and handle with parameters at will.... +++
finally
StrDispose(Buffer);
end;
end;
end.
02. august 2006 - 13:31
#3
Efter du har oprettet et nyt project gemmes projektet som 'Number_5' og unitten som 'mfu'. I mfu-unitten omdøber du form1 til mf_number5 (i Object inspector: name) herefter indlæses koden, ellers kan det være lidt bøvlet at få omdøbt korrekt.
Anders
02. august 2006 - 14:21
#4
hvad bliver dette brugt til? virker jo uden.
(*
// 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, MF);
Application.Run;
if (Mutex <> 0) then CloseHandle(Mutex);
end
else
begin
*)
er der andet i koden som jeg kan fjerne?
02. august 2006 - 15:12
#5
Mutes bruges til at synkronisere afviklingen af programblokke i et program hvis dette afvikles flere gange. Dette kan således også bruges som anført i dit eksempel, men er ikke nødvendigt.
Nu har du ikke skrevet så meget om hvad du vil andet end at "sende parameters" og få koden til at virke. Så kodeoptimering har jeg nu ikke rigtig overvejet. Iøvrigt skal der jo også "fyldes noget i" '.formshow' hvis param's skal bruges første gang programmet startes.
Tjek iøvrigt 'Sende data fra et program til et andet'
http://www.eksperten.dk/spm/720934
03. august 2006 - 08:29
#6
Skal bruge det til min text editor, hvor jeg kan have flere text filer åben på samme tid.
Når jeg double klikker på text filer åbner de med mit program, så jeg skal bare overfører paramstr(1) så jeg kan åbne den i den instance der køre.
btw tak for hjælpen