![]() |
nur eine anwendung mit parametern
Doswidania!!
Ich bin gerade dabei, ein Prog zu schreiben, welches bestimmte Dateien öffnen und bearbeiten kann. Nun möchte ich bewirken, dass, wenn ein User auf eine mit meinem Prog verlinkte Datei (z.B: .html oder .php)clickt, mein Prog, wenn noch keine Instanz jenem dessen existiert das Prog geöffnet wird, die Datei (über Prarmeter) bearbeitet werden kann (shon gelöst!!). Das eigentliche Problem heißt: Wenn shon eine Instanz geöffnet ist, soll die neue bendet werden, aber der Parameter soll irgentwie an die schon existierent existanz übergeben werden!! :wiejetzt: Wie geht denn dass?!?!?????!?!? Danke fuer eventuelle Antworten oder Hinweise. nitroex |
Re: nur eine anwendung mit parametern
Such mal nach
![]() |
Re: nur eine anwendung mit parametern
Hm, genau das hatten wir schonmal.. wenn ich mich nur erinnern könnte... :gruebel:
Naja, such noch ein bisschen, du findest es sicher hier in der DP! MfG Lefko. |
Re: nur eine anwendung mit parametern
Bezüglich des Mehrfachstarts sollte das gehen
Delphi-Quellcode:
var LHandle: Cardinal;
Lclass: Array[0..255] of Char; begin CreateMutex(nil,True,'Beliebiger Ausdruck für den Mutex'); //kein mehrfachstart if GetLastError = ERROR_ALREADY_EXISTS then //kein mehrfachstart begin Lhandle := FindWindow(nil, nil); while Lhandle <> 0 do begin GetClassName(Lhandle, Lclass, 255); if (Lhandle <> handle) and (string(Lclass) = self.ClassName) then begin SendMessage(Lhandle, WM_USER + 2, 0, 0); //an dieser Stelle ist dein Einfallsreichtum gefragt, bei meiner Programmvariante sende ich einfach eine message an die bereits laufende instanz welche sich dann in den fordergrund bringt Lhandle := 0; end else Lhandle := GetWindow(Lhandle, GW_HWNDNEXT); end; Application.Terminate; end; |
Re: nur eine anwendung mit parametern
Hallo,
hier kommt die Lösung: Achtung: das hier ist der Projektquelltext
Delphi-Quellcode:
Jetzt kommt die unit des Hauptformulars
program Project2;
uses Windows, Messages, SysUtils, Forms, Unit1 in 'Unit1.pas' {FormSemaphore}; {$R *.res} var hTargetWnd : hWnd; hSemaphore : THandle; aCopyData : TCopyDataStruct; aParam : String; begin hSemaphore:=CreateSemaphore(Nil,0,1,'Semaphore_1'); If hSemaphore<>0 then begin If GetLastError=ERROR_ALREADY_EXISTS then begin // Suche jetzt das Hauptfenser der ersten Instanz hTargetWnd:=FindWindow('TFormSemaphore',Nil); If hTargetWnd<>0 then begin If ParamCount>0 then // wurden Parameter übergeben begin aParam:=ParamStr(1); // Wenn im Explorer auf eine Datei geklickt // und die Dateiendnung mit dem Programm verknüpft // ist, steht in ParamStr(1) der Pfad und Dateiname // dieser Datei. //verpacke den Dateinamen in eine TCopyDataStruct With aCopyData do begin dwData:=0; cbData:=StrLen(PChar(aParam))+1; // Nullterminierung berücksichtigen mit +1 !!! lpData:=PChar(aParam); end; // with aCopyData do // schicke jetze die WM_COPYDATA Botschaft das Hauptfenser der ersten Instanz SendMessage(hTargetWnd,WM_COPYDATA,LongInt(Application.Handle),LongInt(@aCopyData)); end; // If ParamCount>0 then end; // If hTargetWnd<>0 then end // If GetLastError=ERROR_ALREADY_EXISTS then else begin Application.Initialize; Application.CreateForm(TFormSemaphore, FormSemaphore); Application.Run; CloseHandle(hSemaphore); end; end; end.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFormSemaphore = class(TForm) Label1: TLabel; ListBox1: TListBox; Label2: TLabel; private { Private-Deklarationen } procedure WMCopyData(var Message : TWMCopydata); message WM_COPYDATA; public { Public-Deklarationen } end; var FormSemaphore: TFormSemaphore; implementation {$R *.dfm} { TTFormSemaphore } procedure TFormSemaphore.WMCopyData(var Message: TWMCopydata); {Hier empfängt das Programm die WM_COPYDATA Botschaft. in Message.CopyDataStruct.lpdata steht jetzt der Pfad und der Dateiname. Jetzt muss das nur passend verarbeitet werden.} var sText : Array[0..255] of Char; begin Label2.Caption:='WM_CopyData'; StrLCopy(sText,Message.CopyDataStruct.lpdata,Message.CopyDataStruct.cbdata); ListBox1.Items.Add(sText); end; end. |
Danke!!!
Danke!! Das hat mir extremistisach weitergeholfen.
nitorex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz