Передача массивов из VBA в DLL (BCB) и обратно

Программирование на Visual Basic for Applications
shvevgen
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 12.05.2005 (Чт) 23:26

Передача массивов из VBA в DLL (BCB) и обратно

Сообщение shvevgen » 13.05.2005 (Пт) 0:04

Вопрос: Как передавать одномерные и двумерные массивы из VisualBasic в DLL (созданную в C++Builder) и обратно после их изменения в процессе вычислений в DLL?
В момент компиляции размер неизвестен, т. е. массив динамический.
Сколько ни парился ничего не получилось:
Передаю массив из VBA в С++ DLL по ссылке. А там (в DLL) какой - то мусор

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 13.05.2005 (Пт) 9:34

Почитай об VARIANT.
А к чему такой гемморой???
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

shvevgen
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 12.05.2005 (Чт) 23:26

Сообщение shvevgen » 13.05.2005 (Пт) 12:04

А при чем здесь Variant. Мне надо передавать массивы целого или вещественного типа.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.05.2005 (Пт) 13:09

Сигнатуру функции покажи.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

shvevgen
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 12.05.2005 (Чт) 23:26

Сообщение shvevgen » 13.05.2005 (Пт) 23:06

Объявление и вызов функции из DLL в VBA у меня такие:

Public Declare Sub MyDllFunction Lib "Project1.dll" (MyArray() As Double)
.
.
.
Public Sub MySub()
Dim array() As Double
.
.
.
ReDim array(0 To n)
.
.
.
MyDllFunction(array)

End Sub
//__________________________________________________________________________
В C++ DLL экспортируемая функция имеет следующий код

extern "C" __declspec(dllexport) void __stdcall MyDllFunction(double *CongArray);

void __stdcall MyDllFunction(double *CongArray)
{
.
.
.
//Здесь CongArray содержит всякую хрень, но только не то, что я передавал.

}

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.05.2005 (Сб) 6:44

Мда :)

0. RTFM. Эта тема обсуждалась сотни раз :)
1. Изменить (double *CongArray) на (double *CongArray, int Count)
2. Изменить (MyArray() As Double) на (ByRef MyArray As Double, ByVal Count as long)
3. Вызов:
Код: Выделить всё
redim arr(0 to n)
MyDllFunction arr(lbound(arr)), ubound(arr)-lbound(arr)+1
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

shvevgen
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 12.05.2005 (Чт) 23:26

Сообщение shvevgen » 17.05.2005 (Вт) 22:50

GSerg, спасибо за ответ.
Передать массив из VBA программы в C++ DLL получилось! Но тут же возникла обратная проблема: как сделать, чтобы C++ DLL вернула двухмерный массив в VBA программу. Размер массива не известен в VBA, определяется в DLL.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.05.2005 (Ср) 5:13

Тогда в своей библиотеке обрати внимание на функции, начинающиеся с SafeArray*. В VB параметр объяви как MyArray() As Double, а в C++ как SAFEARRAY** MyArray.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList