(13)、BOOL GetData(void* pCommand, void* pDataBuffer, int nSize)
功能:获取数据
参数:void* pCommand:无类型指针,由StartICDMCommand()函数返回
  void* pDataBuffer:无类型指针,接收数据缓存区
  int nSize:接收数据的大小
返回:TRUE or FALSE
表示获取数据成功或失败================================
我这样做的:
声明:
Private Declare Function GetData Lib "ICDM.dll" (ByVal pCommand As Long, ByVal pDataBuffer As string, ByVal nSize As Long) As Long调用:
Dim nAdr As String * 255
Dim k As Boolean
k = GetData(m_pReturn, nAdr, nLength)=======================================
调用后k为true了,但是nAdr没变,是否哪里写的不对

解决方案 »

  1.   

    试试
    k = GetData(m_pReturn, nAdr, 255)
      

  2.   

    试了下,还是没有。m_pReturn是设备句柄
    nLength是前面一个api使用后得到的
    这两个参数似乎没有问题,主要是中间那个,我哪不准缓冲区的写法和取得。基本按照getcomputername来的,但是结果成功返回k后,缓冲区里竟然没有数据。
      

  3.   

    API函数一般返回整形吧,怎么能返回布尔型呢,感觉有点~
      

  4.   

    换个方案再试:
    Private Declare Function GetData Lib "ICDM.dll" (ByVal pCommand As Long, ByVal pDataBuffer As long, ByVal nSize As Long) As Long
    dim nAdr as long,s as string
    k = GetData(m_pReturn, nAdr, nLength)
    s=space(nLength)
    copymemory s,nAdr,nLength
      

  5.   

    因为是别人写的dll,我这里做的是2次开发,他的2次开发文档就这样写了,还是针对vc的,大部分api都调用成功了,还剩2个不行,这个感觉写的是对的,结果就是返回不了结果,超郁闷。再想一下,明早结贴。还有一个复杂点,明天发贴问,请关注,谢谢。
      

  6.   


    不行再换:
    Private Declare Function GetData Lib "ICDM.dll" (ByVal pCommand As Long, pDataBuffer As Any, ByVal nSize As Long) As Long
    dim a() as byte,s as string
    redim a(nLength-1)
    k = GetData(m_pReturn, a(0), nLength)
    s=strconv(a,vbunicode)
      

  7.   

    谢谢小吉 viena,多种方法试了下,结果都是一样,有点怀疑是不是缓冲区里本来就是为空。
    因为用这个的时候s=space(nLength),先为"    ",返回为4个方块的形式,相当于Dim nAdr As String * 4
      

  8.   

    会不会和我前面返回的类型有关,先贴出来,明天那个api
    (11)void* StartICDMCommand(void* pDevice, int nAddress, int nCommand, 
    void* pParameters = NULL, int nSizeOfParameter = 0)
    功能:发送命令,必须与EndICDMCommand()配套使用
    参数:void* pDevice:无类型指针,由OpenDevice()函数返回
      int nAddress:目标地址
      int nCommand:发送命令字,取枚举变量HD_CMD的值,其定义见节二
      void* pParameters:指向传递参数的无类型指针
      int nSizeOfParameter:传递参数的大小,以字节计
    返回:无类型指针
    例:
    void* m_pReturn; 
    int nAdr, nLength;
    SetWaitTime(m_pDevice, 1000);
    m_pReturn = StartICDMCommand(m_pDevice, 0, nSearchDM, NULL, 0);// 寻机
    if (m_pReturn != NULL)
    if (GetCmdResult(m_pReturn) == nRecvSuccess)
    {
    nLength = GetSizeOfData(m_pActReturn);
    GetData(m_pReturn, &nAdr, nLength);
    }
    EndICDMCmd(m_pReturn);
    ===================================
    我这样声明的,pParameters 里有很多不同类型的结构,只能用any
    Private Declare Function StartICDMCommand Lib "ICDM.dll" (ByVal pDevice As Long, ByVal nAddress As Long, ByVal nCommand As Long, pParameters As Any, ByVal nSizeOfParameter As Long) As Long
      

  9.   

    前面,我的方案中有一个肯定是错的,应该改成这样
    Private Declare Function GetData Lib "ICDM.dll" (ByVal pCommand As Long, ByVal pDataBuffer As long, ByVal nSize As Long) As Long
    dim nAdr as long,a() as byte,s as string
    k = GetData(m_pReturn, nAdr, nLength)
    redim a(nLength-1)
    copymemory a(0),byval nAdr,byval nLength
    s=strconv(a,vbunicode)
      

  10.   

    试试:
    Private Declare Function GetData Lib "ICDM.dll" (ByVal pCommand As Long, ByVal pDataBuffer As long, ByVal nSize As Long) As Long
    dim nAdr as long,a() as byte,s as string
    redim a(nLength-1)
    k = GetData(m_pReturn, varptr(a(0)), nLength)
      

  11.   

    rainstormmaster(暴风雨 v2.0)的可以成功使用,谢谢了小吉的思路也差不多了,只是这个函数使用时中间那个变量不接收long值(声明为long),却可以接收varptr(a(0)),返回正确地址。但是声明为string就不能得到结果。还有一个疑问,返回的是长度为4的数组,但是结果却只返回到a(0)里。