Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Wav-Dateien aus Dll laden - Kein Sound (https://www.delphipraxis.net/228-wav-dateien-aus-dll-laden-kein-sound.html)

Yheeky 22. Jun 2002 17:08


Wav-Dateien aus Dll laden - Kein Sound
 
Hi,

ich habe für mein Programm, welches diverse Wave-Dateien zum Abspielen benötigt, eine Dll Datei erstellt, in der genau diese Wave-Dateien sind. Nachdem die Dll erfolgreich erstellt wurde, wollte ich diese mithilfe meines Programmes folgendermaßen aufrufen:

Code:
PlaySound(PChar(200), Dll, SND_ASYNC [b]or[/b] SND_MEMORY [b]or[/b] SND_RESOURCE);
[color=#000080][i]// die 200 ist die Indexzahl, die in er .rc Datei festgelegt wurde[/i][/color]
Da dieser Versuch scheiterte, ist mir aufgefallen, dass die Dll Datei nirgendwo geladen wird. Also habe ich bei FormCreate die Dll so geladen:

Code:
[b]procedure[/b] TForm1.FormCreate(Sender: TObject);
[b]begin[/b]
  DLL := LoadLibrary('Sound.dll');
[b]end[/b];
Unter public habe ich noch die Variable festgelegt:

Code:
[b]public[/b]
  Dll : HINST;
Dies hat aber auch nicht funktioniert...kann mir da jemand helfen? Ich habe keine Fehlermeldung bekommen, sondern die Wav-Datei wurde einfach nicht abgespielt.

Gruß Yheeky

Christian Seehase 22. Jun 2002 17:35

Moin Yheeky,

ich bin jetzt zwar nicht mit PlaySound so besonders vertraut, aber wenn ich mir die Doku dazu mal ansehe, komme ich zu dem Schluss, dass sich SND_MEMORY und SND_RESOURCE ausschliessen. (mag ein Irrtum sein).
Versuch's also mal ohne SND_MEMORY.

Prinzipiell kann es recht nützlich sein bei der Verwendung von API Funktionen, die's nicht so tun wie erwartet, sich mal den letzten Fehler anzeigen zu lassen. Auch wenn bei der Funktion nichts spezielles dokumentiert ist, kann das helfen.

Also einfach mal

Code:
ShowMessage(SysErrorMessage(GetLastError));
direkt hinter die PlaySound Zeile.

oder

Code:
[b]if[/b] [b]not[/b] PlaySound(...) [b]then[/b]
[b]begin[/b]
  ShowMessage(...);
[b]end[/b];
Vielleicht gibt das ja näheren Aufschluss.

d3g 22. Jun 2002 17:38

Hi Yheeky,

das PSDK sagt dazu:

Zitat:

pszSound
A string that specifies the sound to play.

[...]

Three flags in fdwSound (SND_ALIAS, SND_FILENAME, and SND_RESOURCE) determine whether the name is interpreted as an alias for a system event, a filename, or a resource identifier.
Das deutet darauf hin, dass du den Namen und nicht die Ressourcennummer verwenden musst. Auch im Buch "Win32 Multimedia-API" (Alan C. Moore) heißt es:

Zitat:

Drei Flags in fdwSound ([...]) entscheiden darüber, ob der Text als Dateiname, als Ressourcenbezeichner oder als Alias für einen Systemsound interpretiert wird.
Probier einfach mal, den Namen als String zu verwenden.

MfG,
d3g

Yheeky 23. Jun 2002 00:36

@Christian: Also der Tipp war wirklich gut. Ich habe jetzt zwei Fehlermeldungen auslesen können (mit Stringschreibweise und ohne - z.B. '20' als Index oder 20 als Index):

Code:
1. Der angegebene Ressourcentyp wurde nicht in der Image-Datei gefunden.
2. Die angegebene Image-Datei enthält keinen Ressourcenabschnitt
@d3g: Wie schon im oberen Teil erwähnt...hat nichts geholfen. Durch eine Veränderung der Schreibweise änderte sich nur die Art der Fehlermeldung, aber der Sound wurde trotzdem nicht abgespielt.

Ich hoffe auf weitere Tipps :D ...

Gruß Yheeky

Christian Seehase 23. Jun 2002 01:01

Moin Yheeky,

schön, dass es zumindest zum Einkreisen geholfen hat.
Hast Du auch schon versucht SND_MEMORY wegzulassen?
Ach ja, hast Du eigentlich auch überprüft, ob LoadLibrary überhaupt ein gültiges Handle zurückgeliefert hat (<> 0)? Falls nicht, siehe Tip 1 ;-)

Einen hab' ich noch:
Probier mal statt PChar(200)

Code:
MAKEINTRESOURCE(200)
Dies entspricht zwar eigentlich PAnsiChar(200) und somit PChar(200) aber man kann ja nie wissen ;-)

BTW:
d3g meinte nicht, dass Du die ID als String übergeben sollst, sondern statt der ID den Namen der Resource zu benützen.

Yheeky 23. Jun 2002 13:09

Also die Dll Datei wird richtig geladen. Ich bekomme die Meldung "Der Vorgang wurde erfolgreich beendet.".
SND_MEMORY habe ich auch mal weggelassen, funktioniert aber nicht.
Vielleicht liegt mein Fehler ja schon in der Res-Datei. Ich habe eine Textdatei erstellt und die dort einzubindenden Dateien so aufgelistet:
200 WAVE "Sound.wav"

Ist doch richtig so, oder? RCDATA und WAV hatte ich auch schon versucht, klappt aber auch nicht. Ich bin wirklich ratlos...ich hatte das schonmal hinbekommen, aber jetzt will es nicht mehr funktionieren.

Wie man schon oben an dem Textdateieintrag sehen kann, ist die ID 200 als String "200" oder habe ich das jetzt falsch verstanden?

Achja...MAKEINTRESOURCE funktioniert auch nicht :cry:

Gruß Yheeky

Christian Seehase 23. Jun 2002 13:36

Moin Yheeky,

unter dem Titel

"Playing WAVE Resources"

habe ich im PSDK noch etwas gefunden.

Die Deklaration in der .RC Datei müsste so aussehen

SoundName WAVE c:\sounds\sound.wav

wobei SoundName der Name ist, der dann mit PChar('SoundName') angegeben werden kann, WAVE die Kennung für eine .WAV Resource ist, und c:\sounds\sound.wav die Datei angibt.

Da die Resource bei Dir ja, wie ich vermute, auch mit Deiner Deklaration ohne Meckermeldung eingebunden wurde, wurde zum einen die ID 200 akzeptiert, zum anderen die einzubindende Datei gefunden. Also sollte die Resource als solche OK sein.

Eine Möglichkeit, die mir noch einfällt ist

Code:
PlaySound(PChar('#200'), Dll, SND_ASYNC [b]or[/b] SND_RESOURCE);
Durch das # wird angegeben, dass es sich um eine Resourcen ID handelt, und nicht um einen Resourcennamen.

Yheeky 23. Jun 2002 13:51

Also ich habe eben noch ein altes Programm gefunden, in dem ich das auch mal versucht hatte. Damals habe ich ein String statt einer ID verwendet und siehe da...dann geht´s jetzt auch in meinem neuen Programm.
Deine Idee mit dem # ist interessant. Werde ich mal testen...

Danke für die Hilfe!

Gruß Yheeky

DeathsShadow 27. Okt 2008 14:47

Re: Wav-Dateien aus Dll laden - Kein Sound
 
Ich habe das auch mal versucht umzusetzen, allerdings funktioniert es nicht :(

Die Wave-Datei in die *.Dll zukompilieren ist kein Problem, nur der Aufruf klappt nicht. ... könntest du vielleicht mal den Code posten?

SirThornberry 27. Okt 2008 14:53

Re: Wav-Dateien aus Dll laden - Kein Sound
 
was heißt denn "funktioniert nicht"? hast du dir mal den Fehler ausgeben lassen wie oben beschrieben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz