1

次のシグネチャを持つ関数を使用するサードパーティの C++ dll を使用しています。

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

int各構造体には、 s (VB6 s) の固定 1 次元配列が 1 つだけ含まれていますLongtablep結果が含まれます。

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構造体は(ポインターではなく)値によるものであるため、そこで何ができるかわかりません。

構造体は参照で渡すことができ、固定長の配列を含めることができるため、2番目の引数は問題ありません。実際、intの固定長配列のみが含まれている場合は、質問の2番目の部分のように、固定長VB6長配列を渡すことができます。

于 2012-10-19T07:30:06.653 に答える
0

構造体が次のように定義されている場合:

struct ddTableDeal {
    int data[ ITEM_COUNT ];
};

VB次に、知る限り、配列を使用して呼び出すことはできません。C/C++これは、この構造体のサイズがsizeof(int)*ITEM_COUNT(パディングの場合はさらに大きくなる可能性がありますが、配列では動的であり、 orVBを使用してヒープに割り当てられるため、これらの配列のサイズは常に固定です。私はよくわかりませんが、構造体を in に作成して( in )を順番に使用できる場合は機能する可能性がありますが、最善の解決策は、から変数を取得し、構造体を作成して元の関数を呼び出し、提供された結果を返すプロキシ関数を in に記述することです。バッファ!SafeArrayCreateSafeArrayCreateVectorVBVBITEM_COUNTintLongVBC/C++VBVB

于 2012-10-18T23:04:23.853 に答える