AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Winamp und SendMessage

Ein Thema von wicht · begonnen am 8. Sep 2007 · letzter Beitrag vom 10. Sep 2007
 
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#1

Winamp und SendMessage

  Alt 8. Sep 2007, 09:20
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 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 ...
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
 


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 09:54 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