1、调用API的时候传递指针参数的方法:
声明API的时候把该参数定义为“参数名 As Any”或“ByVal 参数名 As Long”。如果是前者,参数请直接填写变量名、数组元素或常数,这样VB6就会把变量的地址、数组元素的地址、常数的地址(这个常数被放到数据段,然后这里VB会自动获取它的地址)作为参数传递给API。如果是后者(即“ByVal 参数名 As Long”)那么调用的时候请把参数的地址传递给它(用VarPtr取地址)
举例:VB播放内存中的WAV文件数据。
'声明:
Declare Function 播放WAV Lib "winmm.dll" Alias "sndPlaySoundA" (声音文件的指针 As Any, ByVal 标识 As Long) As Long
Const SND_MEMORY = &H4
Const SND_ASYNC = &H1
Global 声音文件的数据() As Byte '声音文件的内容
'初始化:
Sub LoadWAV() '载入WAV的子程序
Open "D:\A.WAV" For Binary Access Read As #1 '声音文件到内存
ReDim 声音文件的数据(LOF(1) - 1) '分配内存
Get #1, , 声音文件的数据 '一次性读取全部
Close #1
End Sub
'播放
Sub PlayWAV()
播放WAV 声音文件的数据(0), SND_MEMORY Or SND_ASYNC '传递数组第一个元素的地址
'因为是这样调用的,所以声明也可以是Declare Function 播放WAV Lib "winmm.dll" Alias "sndPlaySoundA" (声音文件的指针 As Byte, ByVal 标识 As Long) As Long
Declare Sub RtlMoveMemory(Dest As Any, Src As Any, ByVal Len As Long)
复制代码
5、VB编写回调函数,参数列表的写法对应VC++的例子:
VB的“结构体 As 结构体类型”相当于VC++的“结构体类型 &结构体”
VB的“ByVal 长整型 As Long”相当于VC++的“long 长整形”
VB的“长整型 As Long”相当于VC++的“long &长整形”
VB的“数组() As 某类型”相当于VC++的“SAFEARRAY &数组”
当VC++想把一个字节数组传递给VB的时候,VB要这么声明:“ByVal 数组指针 As Long”或者“数组 As Byte(因为是字节数组) ”
然后VB只能通过RtlMoveMemory来控制整个数组。可以先内部用动态数组分配内存,然后用RtlMoveMemory来复制内容到自己的数组以便于操作,最后再用RtlMoveMemory把处理的结果复制出来(因此这样的程序最好不用VB写) VB所有的函数都是_stdcall