Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programmstart via Dateiendung ;-) (https://www.delphipraxis.net/4363-programmstart-via-dateiendung-%3B.html)

Dirk 25. Apr 2003 21:00


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???????

Christian Seehase 25. Apr 2003 21:58

Moin Dirk,

in diesem Thread

Programm nur 1x starten

hatte ich mal was zu diesem Thema geschrieben.

Dirk 25. Apr 2003 23:21

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 ...

Christian Seehase 25. Apr 2003 23:30

Moin Dirk,

also wenn schon WM_COPYDATA niemals ankommt, müsste ein Fehler in der Projektdatei vorliegen.
Wie sieht's denn bei Dir aus.

Dirk 25. Apr 2003 23:43

Code:
  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.
Das müsste aber soweit ok sein oder nicht?

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:
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;
Tjo ... und hab dann halt Abspielen() eingebaut ...

Christian Seehase 26. Apr 2003 00:42

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)

Dirk 26. Apr 2003 11:53

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 20:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz