Я использую стороннюю DLL 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))
Но я не знаю, как объявить функцию выше, так как первый массив упакован в структуру, которая не является указателем.
Вы не можете передавать структуры по значению из VB6 в DLL. Структура tableDeal по значению (не указатель), поэтому я не уверен, что вы можете сделать там.
Вы можете передавать структуры по ссылке, и они могут содержать массивы фиксированной длины, поэтому ваш второй аргумент будет в порядке. На самом деле, если это только содержит массив целых значений фиксированной длины, вы можете просто передать массив длинной длины VB6 фиксированной длины, как во второй части вашего вопроса.
Если структура определяется как:
struct ddTableDeal {
int data[ ITEM_COUNT ];
};
Тогда AFAIK вы не можете позвонить в VB
используя массив, потому что в C/C++
Размер этой структуры sizeof(int)*ITEM_COUNT
(может быть даже больше для заполнения, но в VB
массивы являются динамическими и будут размещаться в куче, используя SafeArrayCreate
или же SafeArrayCreateVector
Размер этих массивов всегда фиксирован. Я не знаю VB
хорошо, но если вы можете создать структуру в VB
и использовать ITEM_COUNT
из int
(Long
в VB
) последовательно это может работать, но лучшее решение — написать прокси-функцию в C/C++
которые получают переменные из VB
создать структуру и вызвать исходную функцию, а затем вернуть результат в VB
предоставленный буфер!