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
{
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
如果行的话就直接用,不行的话也简单dim i as long
dim xx as 结构
i = api调用
copymemory xx,byval i&,len(xx)
xx 结构的内容就被填充了如果能直接返回结构
dim xx as 结构
xx = api调用就行了
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()
特别是这种一边只申请了内存而不释放的做法,常常会导致程序崩溃。建议用 API 的 SAFEARRAY 或 VARIANT 结构,直接对应 VB 的数组和 Variant。
然后再用CopyMemory来将指定数组内容放到VB的变量里。
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