读书人

小弟我在VC++中生成DLL在VB6.0中调用

发布时间: 2012-12-15 15:16:03 作者: rapoo

我在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

读书人网 >VB

热点推荐