VB and VC++ DLL общие данные в программе.

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

VB and VC++ DLL общие данные в программе.

Сообщение Fedorfx » 23.03.2004 (Вт) 2:26

Всем привет.
Пишу прогу на VB, а некоторые функции пишу на VC++.
Так вот в вызываемые функции постоянно передаю некоторые данные из программы.
1-А можно ли в моей DLL как нибудь получить ссылку на какой либо обьект в проге и брать данные оттуда? чтоб не передавать постоянно одни и те же данные.
2- И еще, можно ли например создать массив в VB, передать его в DLL, там изменить размер и вернуть????
3-И можно ли передавать в DLL классы и типпы??
Всем спасибо.

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

Сообщение GSerg » 23.03.2004 (Вт) 9:36

Да на здоровье.
Все классы в VB - COM объекты и имплементят IDispatch.
Все массивы - SAFEARRAY, функции для работы есть в oleaut32.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 23.03.2004 (Вт) 23:28

ОПссс.
Честно говоря не все понял.
Нет ли исходника для примера??? или пару строк кода здесь.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 25.03.2004 (Чт) 21:45

Fedorfx писал(а):ОПссс.

Не обращай внимания, это у GSerg, по ходу, такие шутки юмора. Но на самом деле он прав.
Массивы переопределять нельзя - это раз. Если, конечно, ты работаешь с ним по правилам С++, а не OLE. Далее, классы и типы - см. высказывание вышеупомянутого уважаемого господина. Весь геморрой по работе с ActiveX COM в С++ - твой. Иначе - никак.

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

Сообщение GSerg » 26.03.2004 (Пт) 7:34

Честно говоря, я долго пытался передать в библу на C++ SAFEARRAY, но у меня это не получилось. Указатель на первый элемент - запросто, а вот на сам SAFEARRAY - ни фига. Bad dll calling convention - хоть stdcall, хоть cdecl, хоть даже fastcall.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 29.03.2004 (Пн) 8:15

Bad dll calling convention - хоть stdcall, хоть cdecl, хоть даже fastcall.

Нужно использовать ТОЛЬКО stdcall, никаких cdecl или fastcall.

Честно говоря, я долго пытался передать в библу на C++ SAFEARRAY, но у меня это не получилось. Указатель на первый элемент - запросто, а вот на сам SAFEARRAY - ни фига.

На C:
Код: Выделить всё
SAFEARRAY* __stdcall funcWithArray(SAFEARRAY* *ppsa) {...}
void __stdcall subWithArray(SAFEARRAY* *ppsa) {...}

На VB, если массив Long-ов - проверки сответствия типов нет: как написал, так и будет:
Код: Выделить всё
Private Declare Function funcWithArray Lib "WithArraydll" (arr() As Long) As Long()
Private Declare Sub subWithArray Lib "WithArraydll" (arr() As Long)
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Сообщение GSerg » 29.03.2004 (Пн) 8:27

НИ Х СЕБЕ :shock:
Сколько лет живу на свете, но чтобы функции на VB возвращали указатель на массив... И ведь работает же...

Так. Внимание, вопрос.
Код: Выделить всё
Option Explicit

Function aaa() As Long()
  ReDim aaa(1 To 5)
  MsgBox UBound(aaa)
  'aaa()(3) = 7
End Function

Private Sub Form_Load()
  MsgBox aaa()(3)
End Sub


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

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

Сообщение GSerg » 29.03.2004 (Пн) 8:55

Мдя :o

А ведь когда-то давно... в одном уважаемом источнике мною было прочитано, что нельзя вернуть массив из функции на VB, но можно вернуть variant, содержащий массив...

В общем, http://msdn.microsoft.com/library/defau ... arrays.asp
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 12

    TopList