我正在使用第三方C ++ dll,它使用具有以下签名的函数:
extern "C" __declspec(dllimport) int __stdcall CalcDDtable(struct ddTableDeal tableDeal,
struct ddTableResults * tablep);
每个结构只包含一个int
s的固定一维数组(VB6 Long
s)。 tablep
将包含结果。
如果C ++声明是:
extern "C" __declspec(dllimport) int __stdcall CalcDDtable(int * tableDeal, int * tablep);
那么VB6 Declare
语句就是:
Declare Function CalcDDtable Lib "my3rdParty.dll"(ByRef lngTable as Long,ByRef lngResult as Long) as int
This code would be called like:
Dim lngTables(15) As Long
Dim lngResults(20) As Long
'Initialize the lngTables array...
intResult=CalcDDtabel(lngTables(0),lngResults(0))
但我不知道如何声明上面的函数,因为第一个数组打包在一个不是指针的结构中。
答案 0 :(得分:1)
您不能将值从VB6传递给DLL。 tableDeal结构是按值(而不是指针),所以我不确定你能做什么。
您可以通过引用传递结构,它们可以包含固定长度的数组,因此您的第二个arg就可以了。事实上,如果只包含一个固定长度的整数数组,你可以像问题的第二部分那样传递一个固定长度的VB6长数组。
答案 1 :(得分:0)
如果结构定义为:
struct ddTableDeal {
int data[ ITEM_COUNT ];
};
然后AFAIK您无法使用数组在VB
中调用它,因为C/C++
此结构的大小为sizeof(int)*ITEM_COUNT
(对于填充可能更大但在{{} 1}}数组是动态的,将使用VB
或SafeArrayCreate
在堆中分配,因此这些数组的大小总是固定的。我不太了解SafeArrayCreateVector
但是如果你可以在VB
中创建结构并使用VB
ITEM_COUNT
int
中的Long
顺序它可能会起作用,但最好的解决方案是编写代理函数VB
从C/C++
获取变量,创建结构并调用原始函数,然后在VB
提供的缓冲区中返回结果!