Wav - Res File - How to play.

Posted on 1998-10-25
Medium Priority
Last Modified: 2012-05-04

I placed a wav file into a res file using Visual C++ v5.
I gave it the ID 101
I also also placed 2 bitmap. ID 102 and 103 respectably.
I got the bitmaps out using this statement.
Set Picture1 = LoadResPicture(102, 0)
Set Picture2 = LoadResPicture(103, 0)

But when I tried to get the wav out:
Dim b() As Byte
b = LoadResData(101, 10)
It said that there was no 101 res.
But I know it's in there.

So can somebody show me, how to extract a wav from a res, and
then play it?

Question by:BabyFace
1 Comment

Accepted Solution

kacklehorn earned 200 total points
ID: 1441466
This is taken directly from Q141505 on Microsofts Knowledge Base.


Visual Basic 4.0 introduces a new function called LoadResData, which can be
used to retrieve binary data from a resource (.res) file. The sample in
this document demonstrates how to create a resource file and use binary
data from it in all versions of Visual Basic 4.0.


The following code is a resource script that can be compile by using the 16
and 32-bit versions of Rc.exe.

   // Myres.rc - 16 & 32 bit script. This must be compiled into two .res
   // files using the 16 & 32 bit versions of RC.

   // Wave Resources - You must copy these files from your \Windows
   // directory to the directory where your .rc script resides.

   CHIMES                  WAVE    DISCARDABLE     "Chimes.wav"
   DING                    WAVE    DISCARDABLE     "Ding.wav"

Steps to Create a Resource File

1. Save the above code in Notepad as Myres.rc in the directory where Rc.exe
   exists on your hard disk.

2. Copy Chimes.wav and Ding.wav from your Windows directory (or your
   \Windows\Media directory on Windows 95 or Windows 98) to the same
   directory where you saved Myres.rc.

3. At the command line, type "RC -r Myres.rc." If you want a 16-bit and 32-
   bit version of your resource file, then you will have to save two copies
   of your resource file as Myres32.rc and Myres16.rc, and compile each
   separately with the appropriate resource compiler.

Steps to Run the Sample Application

1. Create a new project and add a command button to Form1.

2. Add the following code to Form1:


      ' Form1.frm - Calls PlayWaveRes to play a wave resource file.


      Sub Command1_Click()
         PlayWaveRes "Chimes"
         PlayWaveRes "Ding"
      End Sub

3. Add your resource file to the project.

4. Type the following code in a new code module:


      ' Baswave.bas - Plays a wave file from a resource using LoadResData.


      Option Explicit
      #If Win32 Then
        Private Declare Function sndPlaySound Lib "winmm" Alias
"sndPlaySoundA" _
                            (lpszSoundName As Any, ByVal uFlags As
Long) As Long
        Private Declare Function sndPlaySound Lib "MMSYSTEM" ( _
                           lpszSoundName As Any, ByVal uFlags%) As Integer
      #End If


      '  Flag values for wFlags parameter.


      Public Const SND_SYNC = &H0        ' Play synchronously (default)
      'Public Const SND_ASYNC = &H1       ' Play asynchronously (see
                                          ' note below!)
      Public Const SND_NODEFAULT = &H2   ' Don't use default sound
      Public Const SND_MEMORY = &H4      ' lpszSoundName points to a
                                         ' memory file.
      Public Const SND_LOOP = &H8        ' Loop the sound until next
                                         ' sndPlaySound.
      Public Const SND_NOSTOP = &H10     ' Don't stop any currently
                                         ' playing sound.


      ' Plays a wave file from a resource.


      Public Sub PlayWaveRes(vntResourceID As Variant, Optional vntFlags)
      ' WARNING:  If you want to play sound files asynchronously in
      '           Win32, then you MUST change bytSound() from a local
      '           variable to a module-level or static variable. Doing
      '           this prevents your array from being destroyed before
      '           sndPlaySound is complete. If you fail to do this, you
      '           will pass an invalid memory pointer, which will cause
      '           a GPF in the Multimedia Control Interface (MCI).
      Dim bytSound() As Byte ' Always store binary data in byte arrays!

      bytSound = LoadResData(vntResourceID, "WAVE")

      If IsMissing(vntFlags) Then
      End If

      If (vntFlags And SND_MEMORY) = 0 Then
         vntFlags = vntFlags Or SND_MEMORY
      End If

      sndPlaySound bytSound(0), vntFlags
      End Sub


Featured Post

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Enums (shorthand for ‘enumerations’) are not often used by programmers but they can be quite valuable when they are.  What are they? An Enum is just a type of variable like a string or an Integer, but in this case one that you create that contains…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

588 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question