![]() |
Programmstart via Dateiendung ;-)
Moin!
Ich hab folgendes Problem: wenn ich ein Dateiendung mit meinem Programm verknüpfe (z.B. wie bei einem MP3-Player mit .mp3s oder eMule mit ed2k:// - Links) und eine zweiten Link aufrufe, wird das Programm auch ein zweites Mal gestartet. OK, dass könnte ich noch verhindern - aber ich hätte lieber, dass der zweite Link mit der alten Instanz gestartet wird ... (also neue MP3-Datei mit Ursprungsplayer als Beispiel). Jemand ne Idee??????? |
|
Danke (2. Lösung). Hatte ich beim Suchen nicht gefunden.
Aber funktioniert bei mir leider nicht (richtig) - die Kommandozeile wird richtig übergeben. Aber mit dem Auslesen habert es wohl ... "if msg.Msg = WM_COPYDATA then" trifft nie zu ... noch ne Idee was ich falsch gemacht haben könnte? Habe es natürlich komplett auf meine Anwendung umgestrickt ... ne MDI-Form hab ich z.B. nicht ... |
Moin Dirk,
also wenn schon WM_COPYDATA niemals ankommt, müsste ein Fehler in der Projektdatei vorliegen. Wie sieht's denn bei Dir aus. |
Code:
Das müsste aber soweit ok sein oder nicht?
var
dwMutex : DWORD; hWindow : DWORD; dwAtom : DWORD; cdWork : TcsCopyDataStruct; begin // Eine eindeutige eigene Message erzeugen // ACHTUNG: In der IDE mit Strg-Shift-G selber generieren nicht diesen Wert übernehmen! // (Es wird einfach eine GUID generiert. Eindeutiger wird ein String nicht // so leicht sein können) // Die Variable dwMessage ist in der Unit MAIN deklariert, da sie dort noch // gebraucht wird dwMessage := RegisterWindowMessage('{3DCA657A-B681-4260-A29C-37C750C9EF43}'); // Mutex erzeugen dwMutex := CreateMutex(nil,true,'mplayer3'); try if GetLastError <> ERROR_ALREADY_EXISTS then begin // Mutex wurde das erste Mal erzeugt, Programm normal starten Application.Initialize; Application.Title := 'YASP'; Application.CreateForm(TForm1, Form1); Application.Run; end else begin // Den Fenstertitel des Programmes abfragen hWindow := FindWindow(nil,'YASP'); if hWindow <> 0 then begin // gefunden, dann den Dateinamen an die laufende Instanz senden if (paramcount > 0) and FileExists(paramstr(0)) then begin // CopyData Struktur füllen cdWork.dwData := dwMessage; // Message, das eine zu ladende Datei da ist cdWork.cbData := Length(paramstr(1))+1; cdWork.lpData := AllocMem(cdWork.cbData); // Speicher reservieren try // Und Dateinamen eintragen CopyMemory(cdWork.lpData,@paramstr(1)[1],cdWork.cbData-1); // Fertig, Daten kopieren SendMessage(hWindow,WM_COPYDATA,0,lParam(@cdWork)); finally // Speicher wieder freigeben FreeMem(cdWork.lpData,cdWork.cbData); end; end; end; end; finally if dwMutex <> 0 then begin CloseHandle(dwMutex); end; end; end. In der (T)Form1 hab ich dann
Code:
protected
procedure WndProc(var msg : TMessage); override;
Code:
type
PcsCopyDataStruct = ^TcsCopyDataStruct; TcsCopyDataStruct = packed record dwData : DWORD; cbData : DWORD; lpData : Pointer; end;
Code:
dwMessage : DWORD;
Code:
Tjo ... und hab dann halt Abspielen() eingebaut ...
procedure TForm1.WndProc(var msg : TMessage);
var frmWork : TForm1; pFileName : PChar; dwLen : DWORD; cdWork : PcsCopyDataStruct; begin if msg.Msg = WM_COPYDATA then begin // Adresse der übergebenen Daten laden cdWork := PcsCopyDataStruct(msg.lParam); // Message prüfen if cdWork.dwData = dwMessage then begin // Neues Unterfenster generieren //frmWork := TForm1.Create(self); // Datei aus übergebenem Namen laden Abspielen(pchar(cdWork.lpData)); end; end else begin // Jede andere Message an die ursprüngliche Prozedure weiterreichen inherited WndProc(msg); end; end; |
Moin Dirk,
erst einmal: Bei dieser Version kannst Du dwAtom, dwMessage, RegisterWindowMessage weglassen. Das hat in diesem Falle keine Funktion. Vorausgesetzt, das Hauptformular hat als Caption YASP, müsste die Message ankommen (Form1.Caption ist nicht das gleiche wie Application.Title) |
LOOL ;-) OK, danke. Natürlich lag es an Form1.Caption. Hab ich nicht dran gedacht, weil die Titel-Zeile eigentlich gar nicht sichtbar ist.
Danke, läuft jetzt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 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