Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Winamp und SendMessage (https://www.delphipraxis.net/99187-winamp-und-sendmessage.html)

wicht 8. Sep 2007 09:20


Winamp und SendMessage
 
Mahlzeit Forum :)

Ich betreue schon seit Jahren ein Programm, was wohl auch von einigen Menschen benutzt wird. Weil es im Freundeskreis starke Verbreitung erfahren hat und mich das motiviert, bin ich mittlerweile fast ein Jahr an einer neuen Version dran, mache mal lange nichts, dann jeden Tag 30 Minuten.. Jedenfalls bin ich fast fertig damit.
Das Programm dient zur "Verwaltung" von MP3/OGG und kann über Plugins Player fernsteuern, in diesem Fall ist das Winamp. Wenn eine Datei in die Playlist rein soll, dann mache ich das mit SendMessage und WM_COPYDATA. Das hat auch immer super geklappt, nur auf einer Veranstaltung, wo das Programm das letzte mal benutzt wurde, fiel mir ein schwerwiegender Fehler auf. Also, man macht einen Doppelklick auf eine MP3, und diese soll in die Playlist angehängt werden. Das läuft folgendermaßen, und nach kurzer Erklärung kommen wir direkt zum Problem. Ein PluginObject regelt die Kommunikation mit einem von mir gebauten Plugin:

Delphi-Quellcode:
function TPluginObject.Perform(Action: TPerformType;
  FileObject: TFileObject): Boolean;
var
  Perform: TPerform;
  Filename: PChar;
begin
  Result := False;

  GetMem(Filename, Length(FileObject.Dirname + FileObject.Filename) + 1);
  StrLCopy(Filename, PChar(FileObject.Dirname + FileObject.Filename), Length(FileObject.Dirname + FileObject.Filename));

  @Perform := GetProcAddress(FDLLHandle, 'Perform');
  if @Perform <> nil then
    Result := Perform(Action, Filename); // PChar(FileObject.DirName + FileObject.FileName));

  FreeMem(Filename, Length(FileObject.Dirname + FileObject.Filename) + 1);
end;
Da wird eine Funktion in einem Plugin aufgerufen. Das Plugin überprüft dann ob Winamp läuft, wenn nicht, wird es gestartet und gewartet, bis
Delphi-Quellcode:
hWND := FindWindow('Winamp v1.x', nil);
nicht 0 ist. Dann wird die Datei in die Playlist eingereiht, mit folgendem Code:

Delphi-Quellcode:
case PerformType of
  ptEnqueue:
  begin
    WinampData.dwData := IPC_PLAYFILE;
    WinampData.cbData := StrLen(Filename) + 1;
    WinampData.lpData := Filename;

    SendMessage(hWND, WM_COPYDATA, 0, Longint(@WinampData));
  end;
Filename ist dabei aus der obigen Funktion der PChar mit Namen Filename, WinampData ist ein TCopyDataStruct.
Das funktioniert soweit auch, nur wenn ich jetzt viele MP3s auf einmal "Enqueue", dann schmiert Winamp ab. Wenn das passiert, findet die DLL beim nächsten Enqueue-Versuch Winamp nicht mehr, startet es neu, fügt da weitere Dateien an. Und wenn es nochmal abschmiert, dann geht das wieder von vorne los.
Ich bin kein Pointer-Profi würde ich mal sagen, und das mit dem GetMem und FreeMem habe ich mir mal eben kurz ergoogelt. Also, es kann gut sein, dass da ein Fehler ist, der für jeden sofort sichtbar ist, aber irgendwie komme ich nicht weiter so, ich habe schon einiges ausprobiert, das hier ist die aktuelle Version. Bei den meisten Dateien klappt es, manchmal stirbt Winamp. Nur warum? Eine einzelne Datei, an der das liegt, konnte ich noch nicht ausmachen :cry: ...

wicht 8. Sep 2007 17:14

Re: Winamp und SendMessage
 
Hm.. ich denke mal das hier haben schon ein paar Leute gelesen.. falls der Code richtig sein sollte und keiner ein Problem aufzeigen kann, wäre das natürlich auch interessant zu wissen :lol:
Tut mir leid.

wicht 10. Sep 2007 17:34

Re: Winamp und SendMessage
 
Falls es noch jemanden interessiert:

http://forums.winamp.com/showthread....hreadid=277155


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 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