各位好,我在写一个VC与VB接口程序的时候出现了点接口上的问题// VC 函数部分
DWORD _stdcall VCDomo(BYTE * BytesBuff,DWORD bSize)
{
   DWORD i=0;
   BytesBuff=(BYTE*)realloc(BytesBuff,bSize+5);  // 这里的时候出错
   for(i=0;i<5;i++){
      BytesBuff[bSize+i]=0xAA;
   }
   Return 0;
}
' VB 函数声明
Private Declare Function VCDomo Lib "VCDomo.dll" (ByRef bBytes As Any, ByVal bSize As Long) As Long
' 按钮事件处理过程
Private Sub Command1_Click()
   Dim BytesArray() As Byte   '定义数组变量
   Redim BytesArray(4)        '设置数组维数
   VCDomo BytesArray(0),5     '调用 VC 接口函数增加数组范围
   Msgbox Ubound(BytesArray)  '显示数组范围
End Sub
上面程序的目的是想将 VB 传到 VC 函数中的字节数组维数放大返回给 VB,但是老出问题。
我还用过 GlobalReAlloc 和 LocalReAlloc 来处理,虽然没有出错,但是返回后没有效果。
希望高手们能给与解答。

解决方案 »

  1.   

    DWORD _stdcall VCDomo(BYTE  BytesBuff[4],DWORD bSize)这样试试
      

  2.   

    因为VB要传输的是一个动态的数组,大小不定,可能几个字节,也可能是几百兆字节,
    但在VC处理中则需要动态的把这个数组加大或缩小,如果在函数定义上就固定了范围,
    是不是不大合适呢?
      

  3.   

    如果你想改变参数BytesBuff指向内存的大小,用指针BYTE * BytesBuff是不行的,所以会出现你说的“返回后没有效果”, 在VC中这种情况一般用指针的指针BYTE ** ppBytesBuff,或指针的引用BYTE *& pBytesBuff。通过函数参数传过来的指针,你只能访问该指针指向的内存,但如果让其指向别的内存,是返不回去的。用指针的指针时,是把指针的地址(不是指针本身)当参数了,所以可以使其指向别的内存。DWORD _stdcall VCDomo(BYTE ** ppBytesBuff,DWORD bSize)
    {
       DWORD i=0;
       *ppBytesBuff=(BYTE*)GlobalReAlloc(bSize+5);  // 这里的时候出错
       for(i=0;i<5;i++){
          (*BytesBuff)[bSize+i]=0xAA;
       }
       Return 0;
    }
      

  4.   

    你的VC DLL是Unicode还是ANSI的?我记得貌似有点关系的
      

  5.   

    我测试了一下,
    DWORD _stdcall VCDomo(BYTE  BytesBuff[1],DWORD bSize)
    这么定义没有出错,也能正常收到VB里的数组信息,但是经过在使用
    BytesBuff=(BYTE*)realloc(BytesBuff,bSize+5);  
    的时候同样会出错
      

  6.   

    不知道,不知道在那看是属于Unicode还是ANSI的
      

  7.   

    不好意思,刚才没看见你的回答,我试验了一下,好像不行,主要是在
    *ppBytesBuff=(BYTE*)GlobalReAlloc(bSize+5);GlobalReAlloc函数的结构是
    WINBASEAPI
    HGLOBAL
    WINAPI
    GlobalReAlloc(
        HGLOBAL hMem,
        DWORD dwBytes,
        UINT uFlags
        );
    但是我 GlobalReAlloc(*BytesBuff,5); 这么用也不行,编译都编译不了
      

  8.   

    你弄错了,realloc的时候必须已经malloc过DWORD _stdcall VCDomo(BYTE *BytesBuff,DWORD bSize)
    {
       DWORD i=0;
       BytesBuff=(BYTE*)malloc(10);// 加上这行
       BytesBuff=(BYTE*)realloc(BytesBuff,bSize+5);  
       for(i=0;i<5;i++){
          BytesBuff[bSize+i]=0xAA;
       }
       Return 0;
    }
      

  9.   

    我这样测试过,VB程序直接崩溃了DWORD _stdcall VCDomo(BYTE **BytesBuff,DWORD bSize)
    {
       DWORD i=0;
       GlobalReAlloc(*&BytesBuff,bSize+5,GMEM_ZEROINIT);
       for(i=0;i<5;i++){
          (*BytesBuff)[bSize+i]=0xAA;
       }
       return 0;
    }
      

  10.   


    DWORD _stdcall VCDomo(BYTE *BytesBuff,DWORD bSize)
    {   
       BYTE *P;
       DWORD i=0;
       P=(BYTE*)malloc(bSize);// 加上这行  
       BytesBuff=(BYTE*)realloc(BytesBuff,bSize+5);
      if(!P) BytesBuff =P;  //防止memory leak
       for(i=0;i<5;i++){
          BytesBuff[bSize+i]=0xAA;
       }
       Return 0;
    }
      

  11.   

    因为你在VB里面redim了,显示的当然是4了。你确认按我8#说的做过了吗?出什么错呢?10改成bSize
      

  12.   

    没有明白lz的意思,不能直接在VB里面做吗?另外,GlobalReAlloc的第一个参数是GlobalAlloc返回的句柄。
      

  13.   

    下面是我用来测试程序的原文DWORD _stdcall VCDomo(BYTE *BytesBuff,DWORD bSize)
    {
       DWORD i=0;
       BytesBuff=(BYTE*)malloc(bSize);// 加上这行
       BytesBuff=(BYTE*)realloc(BytesBuff,bSize+5);  
       for(i=0;i<5;i++){
          BytesBuff[bSize+i]=0xAA;
       }
       return 0;
    }
    Private Declare Function VCDomo Lib "MMEC32.dll" (ByRef bBytes As Any, ByVal bSize As Long) As Long
    Private Sub Command2_Click()
       Dim BytesArray() As Byte   '定义数组变量
       ReDim BytesArray(4)        '设置数组维数
       VCDomo BytesArray(0), 5    '调用 VC 接口函数增加数组范围
       MsgBox UBound(BytesArray)  '显示数组范围
    End Sub结果MSGBOX弹出来的是 4
      

  14.   

    弹出4肯定呀,你在VB里面ReDim了,VB就把后面的舍弃了
      

  15.   

    如果说采用换接口的方式,比如返回个特殊结构给VB,让VB自己去内存读数据不是不可以作,
    只是会增加函数使用的复杂性,如果想使用简单点,就是直接在VC里改变传过来的数组维数返
    回给VB是最好的。如果程序在VB里做,效果就完全不同:Private Sub Command2_Click()
       Dim BytesArray() As Byte   '定义数组变量
       ReDim BytesArray(4)        '设置数组维数
       VBDomo BytesArray, 5    '调用 VC 接口函数增加数组范围
       MsgBox UBound(BytesArray)  '显示数组范围
       
    End Sub
    Private Function VBDomo(ByRef BytesBuff() As Byte, ByVal bSize As Long) As Long
       Dim i As Long
       ReDim Preserve BytesBuff((bSize-1) + 5)    '设置数组维数
       For i = 0 To 5 - 1
          BytesBuff(bSize + i) = &HAA
       Next i
       VBDomo = 0
    End Function结果MSGBOX弹出来的是 9
    我想用VC实现的就是类似的效果,希望兄弟们能伸出援手帮一下
      

  16.   

    我是先想问的是,前4个字符能不能接收到?也就是VB调这个DLL,用我的写法,能不能成功?
      

  17.   

    我看了一下相关资料,估计用 SafeArray 的方法可以实现,我继续研究一下