Playsound



  • Warum soll das nicht gehen?

    Edit: Abgesehen von deinem native main().



  • Achso, ok ^^

    verknüpft habe ich schon und das ganze sieht so aus(.cpp):

    #include "stdafx.h"
    #include <windows.h>
    
    using namespace test;
    
    System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
      Playsound(L"test.wav", NULL, SND_ASYNC); 
    }
    

    Dann kommt das:
    error C3861: "Playsound": Bezeichner wurde nicht gefunden.



  • Im vorherigen Post hast du die Funktion falsch geschrieben: Playsound vs PlaySound

    Ansonsten hier mal die Dokumentation zu besagter Funktion:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd743680.aspx

    Auszug daraus:

    Header: Mmsystem.h (include Windows.h)
    Library: Winmm.lib
    DLL: Winmm.dll

    Die drei Dinge musst du einbinden.



  • Winmm.lib habe ich hier eingebunden: Eigenschaften/Linker/Eingabe/Zusätzliche Abhängigkeiten: winmm.lib .Wo soll winmm.dll hin?



  • 1. Kompiliert es fehlerfrei? Wenn nicht fehlt #include <Windows.h>
    2. Linkt es fehlerfrei? Wenn nicht fehlt die winmm.lib
    3. Startet es fehlerfrei? Wenn nicht fehlt u.U. die winmm.dll

    Die winmm.dll befindet sich üblicherweise im System32 Verzeichnis deiner Windows-Installation. Dort ist sie schon am richtigen Ort, da die DLL beim Starten auch dort gesucht wird.

    Was helfen würde, wäre ein minimales C++/CLI Konsolenprogramm, wo du PlaySound(..) aufrufst. Du zeigst hier nur Code-Schnipsel, die man nicht ohne weiteres nachvollziehen kann.



  • 1.Ja, aber wenn #include <Windows.h> fehlt kommen Fehler.
    2.Es kommt nur das normale Windows-Fehler Geräusch.
    3.Es Startet fehlerfrei(kein Fehler im Ausgabefeld).

    So sieht das Konsolenprogramm aus:

    #include "stdafx.h"
    using namespace std;
    #include <Windows.h>
    
    int main(int argc, char* argv[])//Für die Konsole
    {
        PlaySound(L"test.wav", NULL, SND_SYNC); //Die test.wav habe ich in den Ressourcendateien Ordner reingezogen
    
        return 0;
    }
    
    //Es ertönt nur der Windows-Fehler und die Konsole bleibt offen.
    

    EDIT:Das mit Playsound und PlaySound war wohl ein kleiner Fehler von mir.



  • Die Datei "test.wav" muß dann im Ausführungsverzeichnis (d.h. im selben Verzeichnis wie die EXE) liegen: bin/debug bzw. bin/release.



  • Ok, ich gebe dann Bescheid falls es geklappt hat!

    EDIT:Danke es klappt, aber wie wäre das dann in einer Win-Forms?Auch das gleiche nur ohne int usw.?



  • Ich habe bischen recherchiert und bis binhierhin gekommen(Win-Forms Application):

    #pragma once
    
    namespace TheLegend {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    	using namespace System::Media; //
    
    	/// <summary>
    	/// Zusammenfassung für Form2
    	/// </summary>
    
    	public ref class Form2 : public System::Windows::Forms::Form
    	{
    
    	private: SoundPlayer^ soundPlayer; //
    
    	public:
    		Form2(void)
    		{
    			InitializeComponent();	
    			soundPlayer = gcnew SoundPlayer("the_legend_menu.wav");//
    
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    // ...
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    
    			soundPlayer->Play(); //
    		 }
    

    Ich habe Winmm.lib verknüpft.Das Programm kompiliert fehlerfrei, jedoch wenn ich auf button1 klicke kommt das:

    "The Legend.exe" (Verwaltet (v4.0.30319)): "C:\windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll" geladen
    "The Legend.exe" (Verwaltet (v4.0.30319)): "C:\Users\pre-admin\documents\visual studio 2010\Projects\The Legend\Debug\The Legend.exe" geladen, Symbole geladen.
    "The Legend.exe" (Verwaltet (v4.0.30319)): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll" geladen
    "The Legend.exe" (Verwaltet (v4.0.30319)): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" geladen
    "The Legend.exe" (Verwaltet (v4.0.30319)): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll" geladen
    "The Legend.exe" (Verwaltet (v4.0.30319)): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.resources\v4.0_4.0.0.0_de_b77a5c561934e089\System.resources.dll" geladen
    Eine Ausnahme (erste Chance) des Typs "System.UriFormatException" ist in System.dll aufgetreten.
    Eine Ausnahme (erste Chance) des Typs "System.IO.FileNotFoundException" ist in System.dll aufgetreten.
    Eine nicht behandelte Ausnahme des Typs "System.IO.FileNotFoundException" ist in System.dll aufgetreten.

    Zusätzliche Informationen: Stellen Sie sicher, dass eine Sounddatei am angegebenen Speicherort vorhanden ist.

    Das Programm "[1216] The Legend.exe: Verwaltet (v4.0.30319)" wurde mit Code -805306369 (0xcfffffff) beendet.

    Und noch eine MessageBox, wo das drin steht:

    Eine nicht behandelte Ausnahme des Typs "System.IO.FileNotFoundException" ist in System.dll aufgetreten.

    Zusätzliche Informationen: Stellen Sie sicher, dass eine Sounddatei am angegebenen Speicherort vorhanden ist.



  • Ich habe Winmm.lib verknüpft.

    Naja, da du jetzt offensichtlich PlaySound(..) nicht verwendest ist Winmm.lib nicht mehr nötig. Anstelle dessen scheinst du jetzt auf [url=http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx]SoundPlayer
    [/url] zu setzen, was zumindest in der .NET Welt mehr angebracht ist, als PlaySound(..) .

    Das Programm kompiliert fehlerfrei, jedoch wenn ich auf button1 klicke kommt das:

    Naja, das Programm sagt dir ja ziemlich genau, was das Problem ist. Und zwar wird offenbar die angegebene Sound-Datei nicht gefunden. Die Datei muss im aktuelle Arbeitsverzeichnis deiner Applikation liegen.
    ➡ Finde herraus welches das aktuelle Arbeitsverzeichnis deiner Applikation ist, wenn du es mit Doppelklick auf das Exe im Explorer bzw. aus dem Debugger mit F5 ausführst.

    ABER: Ich rate dir dringend zu C# zu wechseln. Da hast du zumindest weniger Komplextät und die Gefahr, dass du C++ und C++/CLI unwissentlich mischst, wäre damit auch gebannt. Ausserdem hat Visual Studio in neueren Versionen keinen GUI-Editor mehr für Windows Forms mit C++/CLI.



  • Achso das mit PlaySound und SoundPlayer habe ich vergessen zu erwähnen, das ich gewecheselt habe.

    Die .wav ist neben der .exe, also im 1 Debug-Ordner.

    Müsste ich

    soundPlayer = gcnew SoundPlayer("the_legend_menu.WAV");
    

    So schreiben?:

    soundPlayer = gcnew SoundPlayer("c:\ ... the_legend_menu.WAV");
    

    Trotzdem kommt kein Mucks :/.

    Doch ich würde lieber bei C++ (CLI) bleiben.

    EDIT:An der .wav kann es nicht liegen, denn mit dem Media Player hört man es.



  • Hier nochmal der obligatorische Link: http://www.c-plusplus.net/forum/263084



  • Pehlivan schrieb:

    Die .wav ist neben der .exe, also im 1 Debug-Ordner.

    Und jetzt die Quizfrage: Ist das der Ort wo die Datei gesucht wird?
    Antwort: ?

    Weiterführende Frage: Wo wird die Datei gesucht?



  • Ich hatte es mit jedem Ordner versucht und es klappt trotzdem nicht.



  • Pehlivan schrieb:

    Ich hatte es mit jedem Ordner versucht und es klappt trotzdem nicht.

    Glaub ich dir nicht.
    Was meinst du mit "jedem Ordner"? Ich nehme an, dass es einige 1000 auf deinem System sind... 🕶

    Nein, im ernst. Gehe systematisch vor. Ich habe geschrieben, dass es sinnvoll ist herauszufinden, wo gesucht wird. Das könnte man z.B. machen indem man Debugging-Ausgaben ( System::Diagnostics::Debug::WriteLine(..) ) einfügt und bestimmte Dinge überpüft. Gib z.B. das aktuelle Arbeitsverzeichnis aus.

    Edit:
    Ausserdem:

    Simon schrieb:

    Weiterführende Frage: Wo wird die Datei gesucht?

    Falls du die Frage beantwortet hast, darfst du die Antwort ruhig auch hier posten. Das hilft uns zu verstehen, was du machst und wo du stehst.



  • Es wird hier ausgeführt:
    The Legend.vcxproj -> C:\Users\****\Documents\Visual Studio 2010\Projects\The Legend\Debug\The Legend.exe

    Und in dem Ornder hatte ich auch die .wav reingeschoben.



  • Pehlivan schrieb:

    Es wird hier ausgeführt:
    The Legend.vcxproj -> C:\Users\****\Documents\Visual Studio 2010\Projects\The Legend\Debug\The Legend.exe

    Und in dem Ornder hatte ich auch die .wav reingeschoben.

    Wenn du die Applikation aus dem VS startest, ist das Arbeitsverzeichnis (per default) NICHT dort wo das EXE liegt, sondern dort wo das VS Projekt liegt. Wenn du es von der Kommandozeile startest ist es u.U. anders, auch wenn du es per Doppelklick aus dem Explorer startest.

    Tipp: Benutze Directory.GetCurrentDirectory:
    http://msdn.microsoft.com/en-us/library/system.io.directory.getcurrentdirectory.aspx



  • Ich wüsste jetzt nicht, wie ich Directory::GetCurrentDirectory benutzen könnte.
    Könntest du mir ein Beispiel geben(für Win-Forms)?

    Und den Link habe ich mir durchgelesen, doch das hat nicht weitergeholfen.


Anmelden zum Antworten