如何将包含数组 ByVal 的结构C++?

How to pas a struct containing an array ByVal to C++?

本文关键字:结构 C++ ByVal 数组 包含      更新时间:2023-10-16

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

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

每个结构仅包含一个固定的一维ints (VB6Longs)。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))

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

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

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

如果结构定义为:

struct ddTableDeal {
int data[ ITEM_COUNT ];
};

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