首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

小弟我在VC++中生成DLL,在VB6.0中调用VC生成的DLL,返回值是一个结构体,而且结构体中存在指针

2012-12-15 
我在VC++中生成DLL,在VB6.0中调用VC生成的DLL,返回值是一个结构体,而且结构体中存在指针。typedef struct D

我在VC++中生成DLL,在VB6.0中调用VC生成的DLL,返回值是一个结构体,而且结构体中存在指针。
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 Type

Private Declare Function yyy Lib "dll.dll" () As VARVALUE
[最优解释]


Type DATAARRAY
    ab() As Byte
    valType As Byte
    valLength As Integer
End Type

Private 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

[其他解释]
今天在百度和google上找了好久,没找到答案! 希望大家能帮帮我! 
[其他解释]
该回复于2011-04-11 09:23:22被版主删除
[其他解释]

[其他解释]
我也不记得vb里面api能不能直接返回结构类型了
如果行的话就直接用,不行的话也简单

dim i as long 


dim xx as 结构
i = api调用
copymemory xx,byval i&,len(xx)
xx 结构的内容就被填充了

如果能直接返回结构
dim xx as 结构
xx = api调用就行了
[其他解释]

引用:
我也不记得vb里面api能不能直接返回结构类型了
如果行的话就直接用,不行的话也简单

dim i as long 
dim xx as 结构
i = api调用
copymemory xx,byval i&,len(xx)
xx 结构的内容就被填充了

如果能直接返回结构
dim xx as 结构
xx = api调用就行了

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()



[其他解释]
UP! No body helep me

[其他解释]
该回复于2011-04-11 10:51:33被版主删除
[其他解释]
跨语言调用的接口应该考虑两边的兼容性。
特别是这种一边只申请了内存而不释放的做法,常常会导致程序崩溃。

建议用 API 的 SAFEARRAY 或 VARIANT 结构,直接对应 VB 的数组和 Variant。
[其他解释]
VB的数据类型和空间分配和VC的还是有区别的,最好用字节数组来接收结构体数据,
然后再用CopyMemory来将指定数组内容放到VB的变量里。

[其他解释]
能够举个例子么? 都被搞怕了!
[其他解释]
就拿我上面的源码进行进行举例吧! 
[其他解释]
http://blog.csdn.net/laiyiling/archive/2004/10/23/148101.aspx
[其他解释]
http://www.99inf.net/SoftwareDev/VC/14249.htm

热点排行