Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long
Private Const SND_ASYNC = &H1 '异步播放,否则就独占播放
Private Const SND_NODEFAULT = &H2 '不使用缺省声音
Private Const SND_MEMORY = &H4 '指向一个内存文件
Private Const SND_FILENAME = &H20000 '指向一个实际文件
Private Const SND_LOOP = &H8 '循环播放
Private Const SND_ALIAS_START = 0 '结束播放
Dim B() As BytePrivate Sub Command1_Click()  '播放
B = LoadResData(101, "CUSTOM")
sndPlaySound B(0), SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY Or SND_LOOP
End SubPrivate Sub Command2_Click()  '停止
sndPlaySound B(0), SND_ALIAS_START
End Sub
两个问题:
1.启动程序后,先不点击 Command1(即不播放)而点一下 Command2(停止),则“实时错误:9.下标越界。”
2.启动程序后,点击 Command1(播放),在播放之中点Command2(停止),但停止语句无效。
查网上资料找不到解决办法。刚接触vb,请VB高人指点一下。

解决方案 »

  1.   

    看看这本书,上面有,第三章
    http://download.csdn.net/source/3050780
      

  2.   

    第一个问题可用API函数SafeArrayGetDim判断数组B()是否初始化;第二个问题不存在,我测试了一下,可以停止(我打了VB6补丁SP6)。
    Option ExplicitPrivate Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long
    Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long 'API判断数组为空或没有初始化Private Const SND_ASYNC = &H1 '异步播放,否则就独占播放
    Private Const SND_NODEFAULT = &H2 '不使用缺省声音
    Private Const SND_MEMORY = &H4 '指向一个内存文件
    Private Const SND_FILENAME = &H20000 '指向一个实际文件
    Private Const SND_LOOP = &H8 '循环播放
    Private Const SND_ALIAS_START = 0 '结束播放Dim B() As Byte
    Dim IniArray As Long '判断数组B()是否初始化Private Sub Command1_Click() '播放
        B = LoadResData(101, "CUSTOM")
        IniArray = SafeArrayGetDim(B)
        sndPlaySound B(0), SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY Or SND_LOOP
    End SubPrivate Sub Command2_Click() '停止
        If IniArray > 0 Then sndPlaySound B(0), SND_ALIAS_START
    End Sub
      

  3.   

    '如果你的MP3在资源文件当中,应该采用播放内存资源的方法
    Option ExplicitPrivate Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long
    Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long 'API判断数组为空或没有初始化Private Const SND_ASYNC = &H1 '异步播放,否则就独占播放
    Private Const SND_NODEFAULT = &H2 '不使用缺省声音
    Private Const SND_MEMORY = &H4 '指向一个内存文件
    Private Const SND_FILENAME = &H20000 '指向一个实际文件
    Private Const SND_LOOP = &H8 '循环播放
    Private Const SND_ALIAS_START = 0 '结束播放Dim B() As Byte
    Dim IniArray As Long '判断数组B()是否初始化Private Sub PlayMP3() '播放内存资源文件
        B = LoadResData(101, "CUSTOM") '101是自定义资源号,CUSTOM是自定义的资源类型
        IniArray = SafeArrayGetDim(B)
        If IniArray > 0 Then
           sndPlaySound B(0), SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY Or SND_LOOP
           MsgBox "按确定后解除警报!", vbOKOnly + vbCritical + vbSystemModal, "报警提示"
        End If
        If IniArray > 0 Then sndPlaySound B(0), SND_ALIAS_START '停止播放
        'sndPlaySound vbNullString, SND_ALIAS_START
    End SubPrivate Sub Command1_Click()
        PlayMP3
    End Sub'End Sub