Ungültiger Vorgang - Kommunikation mit Winamp



  • Hallo,

    vielleicht kann mir einer von euch helfen. Ich habe ein kleines C++-Programm geschrieben, das einen "Schönheitsfehler" von Winamp beheben soll. Beim Wechsel der Playlist soll das momentan laufende Lied noch zu Ende gespielt werden. Der Aufruf benötigt zwei Parameter: Die neue Playlist-Datei sowie den Pfad zu Winamp. Falls Winamp gestartet ist und abspielt, wird die interne Playlist gelöscht (der aktuelle Song wird weiterhin abgespielt) und die neue Playlist dann hinzugefügt.

    Mein Programm macht auch genau, was es soll, aber trotzdem bekommen ich am Ende eine Fehlermeldung: Diese Anwendung wird aufgrund eines ungültigen Vorgangs geschlossen (ungültige Seite).

    Hier mein C++-Code:

    #include <iostream.h>
    #include <windows.h>
    #include <string>
    
    HWND hwndWinamp = FindWindow("Winamp v1.x",NULL);
    char *summe(char *string1, char *string2)
    {
      int k=0;  
      int k1=strlen(string1);
      while (string2[k] != '\0'){
        string1[k+k1] = string2[k];
        k++;}
      string1[k+k1] = '\0';
      return string1;
    }
    int main(int paramcount, char* paramstr [])
    {
      char *stri1="";
      char *stri2="winamp.exe ";
      char *stri3="\/ADD ";
      char *stri4="";
      if (paramcount>2) stri1=paramstr[2];
      else stri1="C:\\Programme\\Winamp\\";
      if (paramcount>1) stri4=paramstr[1];
      stri1=summe(stri1,stri2);
    if (FindWindow("Winamp v1.x",NULL)==NULL){
      stri1=summe(stri1,stri4);}
    else{
      int ret=SendMessage(hwndWinamp,WM_USER, 0, 104);
    if (ret!=1){
      stri1=summe(stri1,stri4);}
    else{
      stri1=summe(stri1,stri3);
      stri1=summe(stri1,stri4);
      SendMessage(hwndWinamp,WM_USER, 0, 101);}
    }
      system(stri1);
      return (0);
    }
    

    Was habe ich falsch gemacht?

    Danke für eure Hilfe,
    winamper.



  • Mit deiner summe-Funktion schreibst du in Speicher, in den du nicht schreiben darfst, weil du 1. Adressen von Stringliteralen übergibst und 2. über den allokierten Bereich hinaus schreibst.



  • Hallo MFK,

    danke für deine Hilfe. Habe jetzt 'string' verwendet und diesen vor dem System-Aufruf in das erforderliche 'char *' umgewandelt. Bei mir klappt alles. Ich hoffe nur, dass ich bei 'string' nicht auch Speicher reservieren sollte.

    Hier ist mein akutalisiertes Programm. Ein kleiner Tipp: Wer es auf seinem Rechner komfortabel verwenden möchte, kann Playlist-Files (m3u, pls) standardmäßig mit diesem Programm öffnen lassen.
    Eintrag z. B.: C:\Pfad[dieses Programm] "%1"

    #include <iostream.h>
    #include <windows.h>
    #include <string>
    #include <frontend.h>
    
    /* Diese Programm wechselt die WinAmp-Playlist, ohne das aktuelle
       Lied abzubrechen. */
    
    /* Aufruf des Programms mit zwei Parametern: Der erste bestimmt die
       Datei (z. B. Playlist), die abgespielt werden soll, der zweite
       den Pfad zur "winamp.exe" (Standard: "C:\Programme\Winamp\"). */
    
    /* Geöffnetes WinAmp-Fenster suchen - nur bis Version 2.x! */
    HWND hwndWinamp = FindWindow("Winamp v1.x",NULL);
    int main(int paramcount, char* paramstr [])
    {
      string stri1="";
      string stri2="winamp.exe ";
      string stri3="\/ADD ";
      string stri4="";
    /* Pfad zu WinAmp bestimmen:
       Wenn kein zweiter Parameter angegeben ist, wird standardmäßig
       C:\Programme\Winamp\ verwendet. */
      if (paramcount>2) stri1=paramstr[2];
      else stri1="C:\\Programme\\Winamp\\";
    /* Gewünschte Datei (beliebige WinAmp-Datei) bestimmen (wird als
       erster Parameter übergeben). Wird kein Parameter angegeben,
       passiert erstmal nichts. */
      if (paramcount>1) stri4=paramstr[1];
      stri1.append(stri2);
    /* Ist kein WinAmp-Fenster geöffnet, so lautet 'stri1' beispielsweise:
       "C:\Programme\Winamp\winamp.exe C:\Pfadname\playlist.m3u" */
    if (FindWindow("Winamp v1.x",NULL)==NULL){
      stri1.append(stri4);}
    else{
    /* WinAmp-Status prüfen. Wenn gerade nicht abgespielt wird (ret!=1),
       lautet 'stri1' wie oben. Ansonsten wird zuerst die WinAmp-interne
       Playlist gelöscht. 'stri1' lautet dann beispielsweise:
       "C:\Programme\Winamp\winamp.exe /ADD C:\Pfadname\playlist.m3u" */
      int ret=SendMessage(hwndWinamp,WM_USER, 0, 104);
    if (ret!=1){
      stri1.append(stri4);}
    else{
      stri1.append(stri3);
      stri1.append(stri4);
    /* Löschen der internen Playlist (nur wenn mindestens ein Parameter
       angegeben wurde) */
      if (paramcount>1) SendMessage(hwndWinamp,WM_USER, 0, 101);}
    }
      const char *aufruf=stri1.c_str();
    /* WinAmp wird mit den in 'stri1'angegebenen Optionen aufgerufen.
       Desweiteren werden die "Shuffle"- und die "Repeat"-Funktion
       eingeschaltet. */
      cout << aufruf;
      system(aufruf);
      SendMessage(hwndWinamp,WM_WA_IPC,1,IPC_SET_SHUFFLE);
      SendMessage(hwndWinamp,WM_WA_IPC,1,IPC_SET_REPEAT);
      return (0);
    }
    

    Gruß, winamper. 🙂


Anmelden zum Antworten