2012-10-18 53 views
1

我使用第三方C++ DLL,它使用的是具有以下特征的函数:如何将包含数组ByVal的结构传递给C++?

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

的结构各自包含的int秒(VB6 Long多个)只是一个固定一个维阵列。 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

我可能是错的,但我相信你需要在VB中重新创建结构,然后你可以使用它作为byval,byref类型来代替longs。 – M4rc

+0

请参阅Microsoft [用于开发VB6的dll的注意事项](http://vb.mvps.org/tips/vb5dll.asp) – MarkJ

回答

1

您无法将结构按值从VB6传递给DLL。 tableDeal结构是由值(不是一个指针),所以我不知道你可以在那里做什么。

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

+0

谢谢。我现在明白了。我可以掌握源代码,并且不会被任何对C++的深入理解所束缚,改变了方法签名。它现在可以工作,因为数组的内容在C++方法中立即被复制到不同的数组中。唯一令我担心的是我可能引入了内存泄漏。 – Dabblernl

0

如果结构被定义为:

struct ddTableDeal { 
    int data[ ITEM_COUNT ]; 
}; 

然后AFAIK无法使用阵列,因为在C/C++大小这种结构是sizeof(int)*ITEM_COUNT调用它在VB(可以是更大的用于填充但在VB阵列是动态的,会在使用SafeArrayCreateSafeArrayCreateVector堆上分配,所以总是固定的数组的大小。我不知道VB很好,但如果你能在VB创建结构和使用intLong )按顺序它可能工作,但最好的解决方案是编写代理函数C/C++VB获得变量,创建结构和调用原始函数,然后返回结果在VB提供的缓冲区!

+0

-1对不起,但在所有方面**都是**错误。 VB6 *可以将包含固定大小数组的结构传递给C++。运行时为你编组它们。如果您想了解更多信息,请参阅[Microsoft关于从VB5/6调用C++ DLL的注意事项](http://vb.mvps.org/tips/vb5dll.asp)。 – MarkJ