Помогите,pls!Глюк при подключении DLL...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Fidul
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 06.01.2004 (Вт) 21:14

Помогите,pls!Глюк при подключении DLL...

Сообщение Fidul » 06.01.2004 (Вт) 21:51

Подскажите, пожалуйста, кто знает...

Есть DLL написанная на С++ Visual6.
Мне необходимо ей воспользоваться.
VB виснит при попытке работы с массивом переданным в DLL

Вызывается функция op_CalcData в которую передается массив
double **Prices размерности nBagSize на nTimeSize. В DLL объявлена так:
OP_API BOOL __stdcall op_CalcData(double **Prices, COLORREF *Colors, UINT nBagSize, UINT nTimeSize, double **ret)

double **ret - засунута для испытаний


В программе на VB функция объявлена и вызывается так:
Private Declare Function op_CalcData Lib "op.dll" (MasKotir() As Double, Colorr() As ColorConstants, ByVal razmer As Long, ByVal razmermatr As Long, ret() As Double) As Boolean

bol = op_CalcData(MasKotir(), Colorr, razmer, RazmerMasKotir, ret())

MasKotir и ret двумерные массивы одинаковой размерности.

( на разные типы UINT в С++ и LONG на VB и т.п. не обращайте
внимания, все ок!)
Любые попытки работы с массивом поэлементно в DLL приводят к зависанию.
Пример: копирование всех элементов массива Prices в ret
for( UINT i = 0; i< nBagSize; i++){
for(UINT k = 0; k< nTimeSize; k++){
ret[i][k] = Prices[i][k];
}
}
При этом если просто ret=Prices то все ок, но это мне не нужно!
DLL не работае с массивом поэлементно!

Если вызывать из C++ функция работает отлично . Может VB как то криво передает указатели(ссылки) или я где-то делаю что-то не то?

Помогите пожалуйста!
Заранее благодарен!

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

Сообщение GSerg » 07.01.2004 (Ср) 9:43

Да, ты делаешь что-то не то :)
VB работает с SAFEARRAY. Ты объявил функцию так, что сам SAFEARRAY и передаётся. Поэтому либо научи сишную функцию работать с SAFEARRAY, либо объяви в сишной функции вместо приёма двумерного массива приём *double Prices, в VB же это будет byref Prices as double, а вызывать очень просто:
dim p(1 to 100, 1 to 100) as double
op_CalcData (p(1,1), ну и что там ещё)

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

Fidul
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 06.01.2004 (Вт) 21:14

Сообщение Fidul » 09.01.2004 (Пт) 18:14

Спасибо огромное за совет!
Удачи!


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: SemrushBot и гости: 5

    TopList  
cron