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};
(* // 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;
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.... +++
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.
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 *)
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.
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
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.