俺新来的:)
最近,碰到一个问题,请教了多人,也没人能帮俺搞定:(,希望贵宝地的大侠们能帮帮俺问题如下:Dim g_strMagData As String * 1024
Dim g_lngMagLen As LongPublic Declare Function IdtReadMagstripe2 Lib "idtlib.dll" (_
ByVal hCard As Long, _  
ByVal responseBuffer As String, _
ByRef responseBufferLength As Long, _
ByVal TurnCardOff As Long, _
ByVal hNotifyEvent As Long _
) As LongIdtReadMagstripe2是个异步调用的函数,用于从下面的硬件取数据,不过取数据可能需要花费很长时间,所以不等取完,就立即返回;
最后一个参数hNotifyEvent是个事件句柄(event object handler),当数据真正取完的时候,下面就会将hNotifyEvent所代表的事件设置为有信号状态(signaled state)。其他参数含义:
hCard --- 标识欲访问的硬件,从这个硬件取数据
responseBuffer --- 作为接受数据的缓冲区。
ResponseBufferLength --- 存放接受到的数据的字节个数。
TurnCardOff --- 此处无关紧要,可以忽略。俺定义两个全局变量,g_strMagData用作存放数据的缓冲区,作为实参传给responseBuffer,g_lngMagLen用于存放取到数据的字节个数,作为实参传给responseBufferLength。俺的问题是:
当发现hNotifyEvent所代表的事件有信号时,g_lngMagLen被设置成正确的值,但是g_strMagData却没有得到任何数据!!!
俺不明白俺到底哪里出了问题?是不是VB不支持着这样的异步调用? 或者全局string类型变量不能作为异步调用的缓冲区?诸位高人大侠,帮帮俺吧,……

解决方案 »

  1.   

    你要么 ByVal responseBuffer As String, 这个改成ByVal responseBuffer As Long
    然后传个全局字节数组过去看看
      

  2.   

    vb在传byval string给api函数时,会先将string转换到另外一个零时的ansi string,然后把ansi string 当作参数传给 api,当api返回时又把那个零时的 ansi string 立即转回到原来的 unicode string。所以,你的异步函数只知道那个零时的 ansi string,而不知道你真正的 unicode string。可以传入一个字节数组,然后手工把字节数组里的ansi字符串转换为vb的unicode字符串。
      

  3.   

    如果这个函数只用VB调用,传字节数组就可以了.如果还需要其它平台调用还是用byval string比较好