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

时间:2012-10-18 22:45:37

标签: c++ vb6 interop

我正在使用第三方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))

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果结构定义为:

struct ddTableDeal {
    int data[ ITEM_COUNT ];
};

然后AFAIK您无法使用数组在VB中调用它,因为C/C++此结构的大小为sizeof(int)*ITEM_COUNT(对于填充可能更大但在{{} 1}}数组是动态的,将使用VBSafeArrayCreate在堆中分配,因此这些数组的大小总是固定的。我不太了解SafeArrayCreateVector但是如果你可以在VB中创建结构并使用VB ITEM_COUNT int中的Long顺序它可能会起作用,但最好的解决方案是编写代理函数VBC/C++获取变量,创建结构并调用原始函数,然后在VB提供的缓冲区中返回结果!