mcisendstring: Dateinamen aus openfiledialog, Strings werden nicht akzeptiert!



  • Hallo,

    seit ungefähr 5 Stunden sitze ich nun an ein und dem selben Problem.

    ein openFileDialog soll den MP3-Dateinamen inklusive Pfad liefern, die dann durch einen mcisendstring ausgegeben wird.

    In allen Foren einschl. diesem wir dazu geraten den String mit ".c_str()" zu konvertieren.

    Wenn ich aber eingebe (Ausschnitte eines größeren Programms):

    if(System::Windows::Forms::DialogResult::OK==openFileDialog1->ShowDialog()) {
    				 String^ dir=openFileDialog1->FileName;
    				 String^ music=("open "+dir);
    				 String^ play("play "+dir);
    				 String^ close("close "+dir);
    			 }
    
    mciSendString(music.c_str(), 0, 0, 0); 
    mciSendString(play.c_str(), 0, 0, 0); 
    
    //close-Befehl wird verzögert ausgegeben in einem anderen Element(daher kein play...wait)
    mciSendString(close.c_str(), 0, 0, 0);
    

    bekomme ich die Fehlermeldung:
    error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden.

    Benutze ich einen Stringkonverter der mir aus dem ganzen String^ einen wstring schneidert, den ich auch in diesem Forum gefunden habe bekomme ich bei folgender Eingabe zwar keine Fehlermeldung mehr, Musik ist aber trotzdem nicht zu hören.

    mciSendString((LPCWSTR) StringConvW(music), 0, 0, 0);
    mciSendString((LPCWSTR) StringConvW(play), 0, 0, 0); 
    
    //verzögerte augabe
    mciSendString((LPCWSTR) StringConvW(close), 0, 0, 0);
    

    die zugehörige Hilfsklasse in mystring.h:(aus diesem Forum)

    #include <windows.h> 
    #include <tchar.h> 
    using namespace System; 
    struct StringConvA 
    { 
      char *szAnsi; 
      StringConvA(System::String ^s) 
        : szAnsi(static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(s).ToPointer())) 
      {} 
      ~StringConvA() 
      { 
        System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(szAnsi)); 
      } 
      operator LPCSTR() const 
      { 
        return szAnsi; 
      } 
    }; 
    
    struct StringConvW 
    { 
      wchar_t *szUnicode; 
      StringConvW(System::String^ s) 
        : szUnicode(static_cast<wchar_t*>(System::Runtime::InteropServices::Marshal::StringToHGlobalUni(s).ToPointer())) 
      {} 
      ~StringConvW() 
      { 
        System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(szUnicode)); 
      } 
      operator LPCWSTR() const 
      { 
        return szUnicode; 
      } 
    }; 
    
    #ifdef _UNICODE 
    #define StringConvT StringConvW 
    #else 
    #define StringConvT StringConvA 
    #endif
    

    Gebe ich dagegen den ganz normalen Code ein, funktioniert der Code tadellos:

    mciSendString(TEXT("open backgr.mp3"), 0, 0, 0);
    mciSendString(TEXT("play backgr.mp3"), 0, 0, 0); 
    
    //nach einiger Verzögerung dann durch eine andere Aktion:
    
    mciSendString(TEXT("close backgr.mp3"), 0, 0, 0);
    

    Was mich außerdem wundert: Auch ohne Ausführung von:

    mciSendString(TEXT("open backgr.mp3"), 0, 0, 0);
    

    wird im letzen Codebeispiel Sound ausgegeben...

    Ich benutze Visual C++ 2008 Ex. Ed.

    Zur Stringkonvertierung habe ich folgende Seiten gefunden:
    http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx
    http://msdn.microsoft.com/de-de/library/1b4az623(VS.80).aspx

    Mir wäre sehr geholfen wenn mir jemand bei der Lösung dieses Problems helfen würde, schöne Grüße,

    DYK.



  • 1. Benutzte StringConvT (und nicht StringConvW od. A)
    2. Lass den Cast (LPCWSTR) weg. Wenn Du den benötigst, dann ist es ein Fehler und ein Cast ist NICHT die Lösung, sondern bringt nur dem Compiler zu schweigen.



  • Danke erstmal für die Antwort.
    Soweit ich weiß hab ichs schon mit stringConvT ausprobiert ohne Ergebnis, zur Sicherheit mach ichs aber heute nochmal.

    Folgendes habe ich gestern noch gestestet:

    wchar_t str[]=L"play backgr.mp3";
    
    mcisendstring(str,0,0,0);
    

    Jetzt brauche ich nur noch eine Funktion, die mir den LPCWSTR den die Funktion stringConvW oder T oder A ausgibt in ein wchar_t Array schreibt.

    wie geht das genau mit dem stringConv(X)?

    sg DYK.

    THX schonmal!



  • System::String^ music = L"blabla";
    mciSendString(StringConvT(music), 0, 0, 0);
    


  • Danke für die hervorragende Hilfe, das Problem ist gelöst!

    👍 THX@theta!!!! 👍


Log in to reply