用VB通过低级音频函数写录音程序遇到问题:
WAVEHDR的C声名如下:
typedef struct { 
    LPSTR  lpData; //音频数据缓冲区地址
    DWORD  dwBufferLength; 
    DWORD  dwBytesRecorded; 
    DWORD  dwUser; 
    DWORD  dwFlags; 
    DWORD  dwLoops; 
    struct wavehdr_tag * lpNext; 
    DWORD  reserved; 
} WAVEHDR;VB API浏览器得到的声名如下:
Public Type WAVEHDR
        lpData As String
        dwBufferLength As Long
        dwBytesRecorded As Long
        dwUser As Long
        dwFlags As Long
        dwLoops As Long
        lpNext As Long
        Reserved As Long
End Type使用该结构的函数:
Public Declare Function waveInPrepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
--其中lpWaveInHdr是该结构变量,uSize是该结构的长度.现在的问题是: 
lpData参数存放的是音频数据(二进制)而不是字符串,如果就这么调用waveInPrepareHeader函数,则VB可能会把lpData当成是字符串自动做Unicode到ANSI的转换后传给DLL,且获得uSize参数时,Len(lpWaveInHdr)和C中的SizeOf(WAVEHDR)结果也不同(SizeOf返回结构是32,Len返回的取决于lpData的长度)..但如果把lpData声名为Long(用来存放缓冲区句柄),则无法通过VB直接得到缓冲区(我定义的Byte数组)的句柄,即不能这样赋值:lpWaveInHdr.lpData=bytBuffer()......如果传递地址的参数在函数定义内,可以用ByRef搞定,但现在间接通过WAVEHDR传递地址,有没有办法呢?我找遍MSDN都没有答案....
谢谢!!

解决方案 »

  1.   

    //LPSTR  lpData; //音频数据缓冲区地址
    既然是地址,就声明为long吧Private Type WaveFormatEx
      FormatTag As Integer
      Channels As Integer
      SamplesPerSec As Long
      AvgBytesPerSec As Long
      BlockAlign As Integer
      BitsPerSample As Integer
      ExtraDataSize As Integer
    End TypePrivate Type WaveHdr
      lpData As Long
      dwBufferLength As Long
      dwBytesRecorded As Long
      dwUser As Long
      dwFlags As Long
      dwLoops As Long
      lpNext As Long
      Reserved As Long
    End TypePrivate Type WaveInCaps
      ManufacturerID As Integer
      ProductID As Integer
      DriverVersion As Long
      ProductName(1 To 32) As Byte
      Formats As Long
      Channels As Integer
      Reserved As Integer
    End TypeConst WAVE_INVALIDFORMAT = &H0& 'invalid forma
    Const WAVE_FORMAT_1M08 = &H1&   '11.025 kHz,Mono,   8-bit
    Const WAVE_FORMAT_1S08 = &H2&   '11.025 kHz,Stereo, 8-bit
    Const WAVE_FORMAT_1M16 = &H4&   '11.025 kHz,Mono,  16-bit
    Const WAVE_FORMAT_1S16 = &H8&   '11.025 kHz,Stereo,16-bit
    Const WAVE_FORMAT_2M08 = &H10&  '22.05  kHz,Mono,   8-bit
    Const WAVE_FORMAT_2S08 = &H20&  '22.05  kHz,Stereo, 8-bit
    Const WAVE_FORMAT_2M16 = &H40&  '22.05  kHz,Mono,  16-bit
    Const WAVE_FORMAT_2S16 = &H80&  '22.05  kHz,Stereo,16-bit
    Const WAVE_FORMAT_4M08 = &H100& '44.1   kHz,Mono,   8-bit
    Const WAVE_FORMAT_4S08 = &H200& '44.1   kHz,Stereo, 8-bit
    Const WAVE_FORMAT_4M16 = &H400& '44.1   kHz,Mono,  16-bit
    Const WAVE_FORMAT_4S16 = &H800& '44.1   kHz,Stereo,16-bitConst WAVE_FORMAT_PCM = 1Const WHDR_DONE = &H1&
    Const WHDR_PREPARED = &H2&
    Const WHDR_BEGINLOOP = &H4&
    Const WHDR_ENDLOOP = &H8&
    Const WHDR_INQUEUE = &H10&参考:
    http://www.activevb.de/tipps/vb6tipps/tipp0406.html(代码很长,我就不贴了)可从:
    http://www.activevb-archiv.de/downloadstore/tipps/vb6/tipp0406.zip
    下载源代码
      

  2.   

    to:rainstormmaster(暴风雨 v2.0)
    OK已经搞定,谢谢!