Как вставить структуру, содержащую массив ByVal в C ++?

Я использую стороннюю 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))

Но я не знаю, как объявить функцию выше, так как первый массив упакован в структуру, которая не является указателем.

1

Решение

Вы не можете передавать структуры по значению из VB6 в DLL. Структура tableDeal по значению (не указатель), поэтому я не уверен, что вы можете сделать там.

Вы можете передавать структуры по ссылке, и они могут содержать массивы фиксированной длины, поэтому ваш второй аргумент будет в порядке. На самом деле, если это только содержит массив целых значений фиксированной длины, вы можете просто передать массив длинной длины VB6 фиксированной длины, как во второй части вашего вопроса.

1

Другие решения

Если структура определяется как:

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 предоставленный буфер!

0

По вопросам рекламы [email protected]