1

我正在使用第三方 C++ dll,它使用具有以下签名的函数:

extern "C" __declspec(dllimport) int __stdcall CalcDDtable(struct ddTableDeal tableDeal, 
    struct ddTableResults * tablep);

每个结构仅包含一个固定的一维数组ints (VB6 Longs)。tablep将包含结果。

如果 C++ 声明是:

extern "C" __declspec(dllimport) int __stdcall CalcDDtable(int * tableDeal, int * tablep);

那么 VB6Declare语句将是:

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

但是我不知道如何声明上面的函数,因为第一个数组被打包在一个不是指针的结构中。

4

2 回答 2

1

您不能将结构按值从 VB6 传递到 DLL。tableDeal 结构是按值(不是指针),所以我不确定你可以在那里做什么。

您可以通过引用传递结构,它们可以包含固定长度的数组,因此您的第二个参数就可以了。事实上,如果它只包含一个固定长度的整数数组,你可以像问题的第二部分一样传递一个固定长度的 VB6 长数组。

于 2012-10-19T07:30:06.653 回答
0

如果结构定义为:

struct ddTableDeal {
    int data[ ITEM_COUNT ];
};

然后AFAIK你不能在VB使用数组时调用它,因为C/C++这个结构的大小是sizeof(int)*ITEM_COUNT(对于填充可能更大,但在VB数组中是动态的,将使用SafeArrayCreateor在堆中分配SafeArrayCreateVector,所以这些数组的大小总是固定的。我不太清楚VB,但是如果您可以按顺序创建结构VB并使用ITEM_COUNT( in ) int,它可能会起作用,但最好的解决方案是编写一个代理函数,从中获取变量,创建结构并调用原始函数,然后返回提供的结果缓冲!LongVBC/C++VBVB

于 2012-10-18T23:04:23.853 回答