Result = DJ.AcsOpenStream(AcsHander, g_serverID.m_s32Ptr, 1, 32, 32, 0, mData2)
第2个参数在OCX里定义的是一个指针结构体,翻译到VB里如下
Public Type ServerID_t
    m_s8ServerIp(27) As Byte
    m_u32ServerPort As Integer
    m_s8UserName(31) As Byte
    m_s8UserPwd(31) As Byte
End Type现在要传这个结构体到VB里,该怎么传?Function AcsOpenStream(acsHandle As Long, serverID As Long, u8AppID As Integer, u32SendQSize As Long, u32RecvQSize As Long, s32DebugOn As Long, privateData As Long) As Long
这个是函数原型

解决方案 »

  1.   

      传到VB里来?可以再说具体点不?  如果是你在VB中要调用那个ocx的函数,你定义好一个 ServerID_t 类型的变量,把各个成员赋好值后,就用那个变量作为参数进行调用应该可以吧?
      

  2.   

    函数原型中的第二个参数是Long类型
    而不是ServerID_t类型
    你试试用VarPtr()函数获得ServerID_t内存指针,再传给函数试试
    VarPtr()函数VB自带,不过VB不推荐使用指针,所以隐藏掉了
      

  3.   

    Public Type ServerID_t 
        m_s8ServerIp(27) As Byte 
        m_u32ServerPort As Integer 
        m_s8UserName(31) As Byte 
        m_s8UserPwd(31) As Byte 
    End Type Function AcsOpenStream(acsHandle As Long,ByVal serverID As Long, u8AppID As Integer, u32SendQSize As Long, u32RecvQSize As Long, s32DebugOn As Long, privateData As Long) As Long 
    '如果是指针,就要用ByVal.其它的参数不知道你是不是要用于输出的,所以就没改,自己看API说明.'调用时,这样:dim sID as serverid_t   '定义一个这种自定义类型的变量AcsOpenStream AcsHander, VarPtr(sID), 1, 32, 32, 0, mData2
          '使用VarPtr将这个变量的地址取到,是一个LONG值,传入到API里面就行了.
      

  4.   

    其实VB6里面使用指针/内存操作,在某些情况下可以有较大的好处,比如提高速度,或做到一般情况下做不到或很难做到的功能....看这个帖子里:http://topic.csdn.net/u/20080312/14/2dd05a97-0fa1-40e4-8ab6-c1c337ff097f.html8楼是我的方案.使用了大量的字符串处理函数.而9楼,就是利用指针/内存操作的一个好例子.如果按我的方案来使用,倒是没错误,只是在大量调用时,一定会有很多很多的开销.而按9楼的方案,直接一气呵成,基本没开销.....还要继续学习!!!
      

  5.   

    Function AcsOpenStream(acsHandle As Long,ByVal serverID As Long, u8AppID As Integer, u32SendQSize As Long, u32RecvQSize As Long, s32DebugOn As Long, privateData As Long) As Long 
    '如果是指针,就要用ByVal.其它的参数不知道你是不是要用于输出的,所以就没改,自己看API说明.这个函数原型不是VB定义的,是OCX里定义好的,不能改的AcsOpenStream AcsHander, VarPtr(sID), 1, 32, 32, 0, mData2
          '使用VarPtr将这个变量的地址取到,是一个LONG值,传入到API里面就行了.我是这么调用的,但是出错,楼上的大哥,我的QQ是:32416070,希望和你探讨下这个问题
      

  6.   

    ====================================================
    Function AcsOpenStream(acsHandle As Long,ByVal serverID As Long, u8AppID As Integer, u32SendQSize As Long, u32RecvQSize As Long, s32DebugOn As Long, privateData As Long) As Long  
    '如果是指针,就要用ByVal.其它的参数不知道你是不是要用于输出的,所以就没改,自己看API说明. 这个函数原型不是VB定义的,是OCX里定义好的,不能改的 
    AcsOpenStream AcsHander, VarPtr(sID), 1, 32, 32, 0, mData2 
          '使用VarPtr将这个变量的地址取到,是一个LONG值,传入到API里面就行了. 我是这么调用的,但是出错, 楼上的大哥,我的QQ是:32416070,希望和你探讨下这个问题
    ====================================================  楼主试一下这样调用可以不:
    AcsOpenStream AcsHander, ByVal VarPtr(sID), 1, 32, 32, 0, mData2