typedef struct DataArray
{
    unsigned char* ab;
 unsigned char  valType;
 unsigned int valLength;}DATAARRAY; extern "C" DATAARRAY __declspec(dllexport) yyy()
{
 DATAARRAY test;
    test.valLength=5;
 test.ab = (unsigned char *)malloc(test.valLength);
 test.ab[0]=11;
 test.ab[1]=12;
 test.ab[2]=13;
 test.ab[3]=14;
 test.ab[4]=15;
    test.valType=2; 
 return test;
}
以上生成DLL
VB程序如下,请同仁帮我看看应该怎么修改!!!
Public Type VARVALUE
    value As Variant
    valType As Byte
    valLength As Integer
End TypePrivate Declare Function yyy Lib "dll.dll" () As VARVALUE

解决方案 »

  1.   

    今天在百度和google上找了好久,没找到答案! 希望大家能帮帮我! 
      

  2.   

    我也不记得vb里面api能不能直接返回结构类型了
    如果行的话就直接用,不行的话也简单dim i as long 
    dim xx as 结构
    i = api调用
    copymemory xx,byval i&,len(xx)
    xx 结构的内容就被填充了如果能直接返回结构
    dim xx as 结构
    xx = api调用就行了
      

  3.   

    C语言导出DLL
    typedef struct data
    {
    unsigned char  valType;
    unsigned int valLength;
    }DATA;
     extern "C" DATA  __declspec(dllexport) xxx()
     {   
        DATA data1;
    data1.valLength=100;
    data1.valType =50;
    return data1;
     }
    VB6.0是可以返回结构体的,如下:
    Public Type DATA    valType As Byte
        valLength As Long
        
    End Type
    Private Declare Function xxx Lib "dll.dll" () As DATA   Dim aaa As DATA
        aaa = xxx()
       Text1(0).Text = aaa.valLength这样是没问题的,关键是结构体中存在指针,这个我就不知道怎么弄了。我单独返回指针又是可以的,如下例子
     extern "C" unsigned char* vvv()
     {
       unsigned char * data2;
    data2=( unsigned char *) malloc(4);
    data2[0]=1;
    data2[1]=2;
    data2[2]=3;
    data2[3]=4;
        return data2;
     }
    VB调用如下
    Private Declare Function vvv Lib "dll.dll" () As String
       Dim ddd As String
       ddd = vvv()
      

  4.   

    UP! No body helep me
      

  5.   

    跨语言调用的接口应该考虑两边的兼容性。
    特别是这种一边只申请了内存而不释放的做法,常常会导致程序崩溃。建议用 API 的 SAFEARRAY 或 VARIANT 结构,直接对应 VB 的数组和 Variant。
      

  6.   

    VB的数据类型和空间分配和VC的还是有区别的,最好用字节数组来接收结构体数据,
    然后再用CopyMemory来将指定数组内容放到VB的变量里。
      

  7.   


    Type DATAARRAY
        ab() As Byte
        valType As Byte
        valLength As Integer
    End TypePrivate Declare Function yyy Lib "dll.dll" () As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( & _
              Destination As Any, _
              Source As Any, _
              ByVal Length As Long)
    Sub Main()
        Dim RetArray() As Byte
        Dim RetLong As Long
        Dim MemorySize As Long
        Dim RetData As DATAARRAY    Redim RetArray(6)
        RetLong = yyy()                     '返回DATAARRAY结构的指针
        CopyMemory RetArray(0),RetLong,7    '取得DATAARRAY结构数据
        CopyMemory RetLong,RetArray(0),4    '取得ab指针
        MemorySize = GlobalSize(RetLong)   '取得ab指针的内存分配大小(必须由GlobalAlloc分配的内存才有效)
        Redim RetData.ab(MemorySize-1)      '分配ab指针的大小
        CopyMemory RetData.ab(0),RetLong,MemorySize    '取得ab指针的内容到VB结构体里
        CopyMemory RetData.valType,RetArray(4),1    '取得DATAARRAY结构的valType数据    
        CopyMemory RetData.valLength,RetArray(5),2    '取得DATAARRAY结构的valLength数据
        '完成RetData数据的处理
    End Sub
      

  8.   

    http://blog.csdn.net/laiyiling/archive/2004/10/23/148101.aspx
      

  9.   

    http://www.99inf.net/SoftwareDev/VC/14249.htm