AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Programmstart via Dateiendung ;-)
Thema durchsuchen
Ansicht
Themen-Optionen

Programmstart via Dateiendung ;-)

Ein Thema von Dirk · begonnen am 25. Apr 2003 · letzter Beitrag vom 26. Apr 2003
Antwort Antwort
Benutzerbild von Dirk
Dirk

Registriert seit: 5. Jan 2003
Ort: Hamm
8 Beiträge
 
#1

Programmstart via Dateiendung ;-)

  Alt 25. Apr 2003, 21:00
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???????
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 25. Apr 2003, 21:58
Moin Dirk,

in diesem Thread

Programm nur 1x starten

hatte ich mal was zu diesem Thema geschrieben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Dirk
Dirk

Registriert seit: 5. Jan 2003
Ort: Hamm
8 Beiträge
 
#3
  Alt 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 ...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Dirk
Dirk

Registriert seit: 5. Jan 2003
Ort: Hamm
8 Beiträge
 
#5
  Alt 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 ...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Dirk
Dirk

Registriert seit: 5. Jan 2003
Ort: Hamm
8 Beiträge
 
#7
  Alt 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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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