PlaySound: Pfad als String übergeben



  • Guten Abend,

    Ich möchte der PlaySound-Funktion den Pfad zum Ort der WAV-Datei als Variable übergeben, weil ich den Namen vom Benutzer abfragen will. Die PlaySound-Funktion funktioniert auch soweit, d.h. wenn ich einen Pfad per Hand eintrage geht alles, nur eben nicht bei einer Übergabe wie in folgendem Codeabschnitt:

    string name, pfad;
    
    while ( name != "exit"){ 
    
    	cin >> name;
    
    	pfad = "\"Sounds/" + name + ".wav\"";
    
    	pfad = pfad.c_str();
    
    	PlaySound(pfad, NULL, SND_FILENAME);
    
    	}
    
    	return 0;
    }
    

    Ich weiß inzwischen auch, dass das Argument in PlaySound ein LPCWSTR sein muss, allerdings weiß ich nicht wie ich den string in einen solchen ändern kann, ich dachte .c_str wäre ausreichend.

    Was mache ich falsch?

    Viele Grüße
    Marc



  • string name, pfad;

    while ( name != "exit"){

    cin >> name;

    pfad = "\"Sounds/" + name + ".wav\"";

    PlaySound(pfad.c_str(), NULL, SND_FILENAME);

    }

    return 0;
    }

    Sollte das noch immer nicht funktionieren, dann stell dein Projekt von Unicode auf Multibyte um und füge evtl. einen Cast hinzu:

    PlaySound(static_cast<LPCSTR*>(pfad.c_str()), NULL, SND_FILENAME);
    


  • nexxxxxx schrieb:

    Ich weiß inzwischen auch, dass das Argument in PlaySound ein LPCWSTR sein muss

    Nein, das ist ein LPCTSTR.

    ich dachte .c_str wäre ausreichend.

    Ja, string::c_str() gibt einen const char* zurück, was passen würde. Allerdings speicherst du den Rückgabewert von c_str() wieder in einen String, sodass du nichts gewonnen hast.

    lköklö schrieb:

    PlaySound(static_cast<LPCSTR*>(pfad.c_str()), NULL, SND_FILENAME);
    

    Was soll der Cast? Außerdem ist ein * zu viel.



  • string name, pfad;
    
    while ( name != "exit"){ 
    
    	cin >> name;
    
    	//pfad = "\"Sounds/" + name + ".wav\""; // die "" IM string sind falsch
    	pfad = "Sounds\\" + name + ".wav"; // und unter windows verwendet man normalerweise \ als pfad-trennzeichen (obwohl / auch an vielen Stellen funktioniert)
    
    	//pfad = pfad.c_str(); // das macht im ideallfall nix und im schlechtesten fall nen schönen laufzeitfehler
    
    	PlaySoundA(pfad.c_str(), NULL, SND_FILENAME); // wenn du std::string verwendest, dann ruf PlaySoundA auf, für std::wstring PlaySoundW
    
    	}
    
    	return 0;
    }
    


  • Vielen Dank für die Hilfe! Und danke Hustbaer für diese elegante Lösung, bei meiner Suche im Internet bin ich nie über PlaySoundA gestolpert, danke dafür!

    Viele Grüße
    Marc



  • (Fast) alle Windows Funktionen die irgendwie mit Strings arbeiten (z.B. entweder direkt String-Parameter nehmen, oder Zeiger auf Structs die Strings enthalten) gibt es als "A" und "W" Version.
    Ebenso die entsprechenden Structs.

    Die "ohne A/W" Version ist in Wirklichkeit nur ein #define, das je nachdem ob UNICODE definiert ist auf xxxA oder xxxW erweitert wird.



  • nexxxxxx schrieb:

    Vielen Dank für die Hilfe! Und danke Hustbaer für diese elegante Lösung, bei meiner Suche im Internet bin ich nie über PlaySoundA gestolpert, danke dafür!

    Viele Grüße
    Marc

    Oha - dann solltest du dich erstmal mit einigen Grundlagen bezüglich der WinAPI vertraut machen.
    Bezüglich FunktionsnameW und FunktionsnameA lies dir beispielsweise mal folgendes durch: MSDN - Working with Strings

    The Complete Guide to C++ Strings, Part I - Win32 Character Encodings ist ebenfalls lesenswert.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten