Передача обьектов в DLL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Передача обьектов в DLL

Сообщение Tarantul » 25.08.2005 (Чт) 13:48

Как это правильно сделать?

Если например, моя DLL-функция типа

QFUNC_API void SomeFunc(LPDIRECTDRAWSURFACE7 lpdd)
{
...
}

в VB пишу так
declare sub SomeFunc lib "SomeLib.dll" (ByVal lpSurface as long)

потом какой адрес надо передавать, что потом вызывать методы типа lpdd->lock?

и на objptr, и на varptr вылетает :(

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.08.2005 (Чт) 13:50

Call SomeFunc(ObjPtr(someobj))
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 25.08.2005 (Чт) 13:51

Ой, про вылет не заметил.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение GSerg » 25.08.2005 (Чт) 13:51

Интересно, зачем так делать...

ByVal lpSurface as DirectDrawSurface7 ?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 25.08.2005 (Чт) 13:56

А так будет работать?

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

Сообщение GSerg » 25.08.2005 (Чт) 13:59

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

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 25.08.2005 (Чт) 15:44

Ну, мало что..
Может, в VB обьекты иемют не структуру, что в C++...

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

Сообщение GSerg » 25.08.2005 (Чт) 15:49

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

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 25.08.2005 (Чт) 18:10

Я как раз уже об этом подумал :(

Насколько я понял - обьект DirectDrawSurface7 в VB - это не DirectDrawSurface7 в C++; В VB в нем много вспомогательных функций (типа DrawLine), основные имеют слегка другой вид. Часть функций отсутствует. Через dx7vb.dll VB представляет нормальный DirectDrawSurface7.

Так что, указатель на обьект то передается нормально, но вызываемый метод Lock имеет дургой список параметров, и все вылетает :(

Похоже тупик :(

Разве что можно как-то получить указатель на истинный DirectDrawSurface7 через VB :?:

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

Сообщение GSerg » 26.08.2005 (Пт) 2:32

Можно, заюзав QueryInterface :)
Только в VB это сложно :) Хотя, помнится, где-то была tlb для этого, если я ничего не путаю...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 26.08.2005 (Пт) 7:46

Похоже проще уже либо вызвать метод Lock в VB, лиюо уже все делать на C++ :(

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

Сообщение GSerg » 26.08.2005 (Пт) 8:04

А, нет, почему же :)

Передавай ByVal lpSurface as DirectDrawSurface7.
Первым делом в dll вызывай queryinterface. Работай с полученным. Потом ему release.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

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

    TopList