Einzelnen Beitrag anzeigen

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