MediaPlayer + Verknüpfung auf wav-Datei



  • Hallo,

    in meiner Anwendung lese ich wav- und mp3-Dateien aus einem Verzeichnis in eine ListBox ein. Der Benutzer kann dann einen Eintrag auswählen und per Doppelklick abspielen. Soweit so gut.

    Wie kann ich es anstellen, dass der MediaPlayer auch Verknüpfung auf wav- oder mp3-Dateien, die sich in diesem Verzeichnis befinden, abspielt.

    Gruß
    Leo



  • So???

    //Testet in FileName uebergebenen Dateinamen
    //Falls es eine *.LNK- Datei ist:
    //  Returnwert = "Datei" oder "Verzeichnis"
    //  in FileName wird gelinkter Namen zurueckgegeben!
    //sonst
    //  Returnwert= "Kein Link" oder "gelöscht"
    
    AnsiString __fastcall GetLinkedFile(AnsiString &FileName)
    {
      AnsiString SL_Typ;
      HRESULT hres;
      IShellLink *pShLink;
      char Path[MAX_PATH];
      char Descript[MAX_PATH];
      char WorkDir[MAX_PATH];
      char Arguments[MAX_PATH];
      WIN32_FIND_DATA wfd;
      hres=CoInitialize(NULL);
      if (SUCCEEDED(hres))
      { hres = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&pShLink );
        if (SUCCEEDED(hres))
        {  IPersistFile *ppf;
           hres = pShLink->QueryInterface( IID_IPersistFile, (LPVOID *)&ppf );
           if (SUCCEEDED(hres))
           {  WORD wsz[MAX_PATH];
              MultiByteToWideChar( CP_ACP, 0, FileName.c_str(), -1, (wchar_t*)wsz, MAX_PATH );
              hres = ppf->Load((wchar_t*)wsz, STGM_READ );
              if (SUCCEEDED(hres))
              { hres = pShLink->GetPath(  &Path[0], MAX_PATH, &wfd, SLGP_UNCPRIORITY/*oder: SLGP_SHORTPATH für kurze Namen*/ );
                if(SUCCEEDED(hres))
                { hres = pShLink->GetDescription( &Descript[0], MAX_PATH );
                  if(SUCCEEDED(hres))
                  { hres = pShLink->GetWorkingDirectory( &WorkDir[0], MAX_PATH );
                    if(SUCCEEDED(hres))
                    { hres = pShLink->GetArguments( &Arguments[0], MAX_PATH );
                    }
                  }
                }
              }
              else
                SL_Typ="Kein Link";
              ppf->Release();
           }
           pShLink->Release();
        }
        CoUninitialize();
      }
      if (hres==0)
      { TSearchRec SR;
        if (FindFirst(Path,faAnyFile,SR)==0)
        { if ((SR.Attr&faDirectory)==faDirectory)
            SL_Typ="Verzeichnis";
          else
            SL_Typ="Datei";
          FileName=Path;
        }
        else
        { SL_Typ="Gelöscht";
        }
        FindClose(SR);
      }
      return SL_Typ;
    }
    


  • Hi,

    zunächst mal Danke für die üppige Antwort.

    Nur leider gelingt es mir bisher nicht, den passenden Include heraus zu finden, um

    IShellLink
    

    referenzieren zu können.

    Hättest Du eine Idee?

    Gruß
    Leo



  • #include <shlobj.h> 🙂



  • DerAltenburger schrieb:

    #include <shlobj.h> 🙂

    Hi,

    Danke, den Include hatte ich zwischenzeitlich auch entdeckt.

    Jetzt stehe ich vor einem neuen Problem, das ich nicht ergrüden kann:

    hres=CoInitialize(NULL);
      if (SUCCEEDED(hres))
    

    CoInitialize funktioniert bei mir nie, da if (SUCCEEDED(hres)) immer false zurückgibt.

    Woran kann es liegen?

    Gruß
    Leo



  • Shau mal hier:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/cmf_a2c_36qt.asp

    Welche Rueckgabe von CoInitialize hast Du? Eventuell fehlt in einem Deiner Module ein abschliessendes CoUninitialize ?



  • DerAltenburger schrieb:

    Shau mal hier:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/cmf_a2c_36qt.asp

    Welche Rueckgabe von CoInitialize hast Du? Eventuell fehlt in einem Deiner Module ein abschliessendes CoUninitialize ?

    Hallo,

    Problem gelöst!

    Ich war bei meinem CoInitialize-Aufruf einfältigerweise davon ausgegangen, dass nur der Rückgabewert TRUE den Weg für den weiteren Programmablauf freimacht.
    Jetzt erfahre ich aber bei (noch) näherer Betrachtung der Doku, dass der Rückgabewert FALSE bedeuten kann, dass die Initialisierung bereits erfolgt ist.
    Somit also kein Grund mehr vorliegt, denn nachfolgenden Programmteil nicht ausführen zu lassen.

    Danke nochmal an alle!

    Gruß
    Leo

    Das kann irgendeine Bibliothek gemacht haben. Ist aber auch nicht weiter wichtig. Ändere den Code einfach so ab:

    C/C++ Code:
    blRetVal = SUCCEEDED(CoInitialize(NULL));
    C/C++ Code:
    blRetVal = SUCCEEDED(CoInitialize(NULL));
    C/C++ Code:
    blRetVal = SUCCEEDED(CoInitialize(NULL));


Anmelden zum Antworten