Передача строк из DLL, написанной на Delphi

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

Передача строк из DLL, написанной на Delphi

Сообщение Faust » 12.11.2009 (Чт) 20:32

Вопрос, насколько я понимаю, классический. Те ответы, которые я на него находил сводятся к "исправляй код функции в Delphi".
Есть плата АЦП/ЦАП, для доступа к драйверу которой имеется DLL. В документации к ней функцию инициализации работы с драйвером предлагают объявлять вот так:
Код: Выделить всё
function  ET_StartDrv: string; stdcall; external 'ET1255.DLL'

Наскоро проставленного Delphi 5 (ай-ай-ай, авторское право) и прочитанного хелпа хватило на то, чтобы написать библиотеку-"обертку" для возвращающих строковые значения функций. Хотелось бы узнать, реализовывал ли кто-то способы поэлегантней (и есть ли они вообще). Комментарий в начале пустого DLL-проекта в Delphi намекает копать в сторону BORLNDMM.DLL. Или лучше не стоит?
Листинги не горят!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Передача строк из DLL, написанной на Delphi

Сообщение Денис » 13.11.2009 (Пт) 8:38

Код: Выделить всё
Private Declare Function ET_StartDrv Lib "ET1255.DLL" () As String
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Передача строк из DLL, написанной на Delphi

Сообщение ANDLL » 13.11.2009 (Пт) 10:56

Функция которая вернет строку?
Ээээээ. Не представляю себе какой ужасный программер писал такое, но он явно не хотел что бы его либу юзали из других языков.
Вообще, Faust, коль скоро мы не знаем что там в делфях со строками, логика следующая:
Во первых попробовать конечно объявление из предыдущего поста, авось чудо и оно заработает.
Если нет - обявить as long, и посмотреть что там за число возвращается.
Если там указатель на юникодную строку, да еще и на BSTR - делаем просто копирование указателя в стринговую переменную.
Если работает(а это наиболее вероятный вариант) - ура.
Если нет, или там не BSTR, определяем что же именно там такое, потом копируем это в нашу VBшную строку.... Потом либо ищем функцию в делфийской библиотеке которая освобождает память, либо.... забиваем :)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Re: Передача строк из DLL, написанной на Delphi

Сообщение Faust » 13.11.2009 (Пт) 12:15

Во первых попробовать конечно объявление из предыдущего поста, авось чудо и оно заработает.
Если нет - обявить as long, и посмотреть что там за число возвращается.

Что первое, что второе - приводит к "вылетающему" с ошибкой IDE.
Пытался объявлять как Sub (вообще-то, эта строка не так уж и интересует, в ней хранится сообщение об ошибке) - те же результаты.
Насколько я понял из чтения тредов с описанием подобных проблем, в Delphi при попытке функции возвратить string происходит выделение локальной памяти, которая освобождается сразу после того, как вызванная из DLL функция прекратит работу. И только (только ли?) SharedMem, который используют написанные на Deplhi проекты, способен предотвратить непоправимое. Сейчас планирую поэкспериментировать (сказывается отсутствие фундаментальной подготовки в отношении системного программирования - надо ЗНАТЬ такие вещи), измениться ли что-то при вызове этой функции через LoadLibrary->GetProcAddress->CallWindowProc.
Листинги не горят!

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Передача строк из DLL, написанной на Delphi

Сообщение ANDLL » 13.11.2009 (Пт) 12:20

Ненене, секундочку.
Насколько я понял из чтения тредов с описанием подобных проблем, в Delphi при попытке функции возвратить string происходит выделение локальной памяти, которая освобождается сразу после того, как вызванная из DLL функция прекратит работу.
Это брiд
Нужно либо посмотреть сгенерированный код самой функции. Либо что лучше, написать на делфи маленкью прогу которая вызывает функцию, и в отладчике посмотреть какой код генерируется для вызова.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Re: Передача строк из DLL, написанной на Delphi

Сообщение Vi » 16.11.2009 (Пн) 10:04

Faust писал(а):Есть плата АЦП/ЦАП, для доступа к драйверу которой имеется DLL. В документации к ней функцию инициализации работы с драйвером предлагают объявлять вот так:

И что говорит еще твоя документация? На каком языке вообще написан драйвер? Есть ли прототип для С/С++, который проще может быть переведен на VB?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Re: Передача строк из DLL, написанной на Delphi

Сообщение Faust » 16.11.2009 (Пн) 16:21

Vi писал(а):И что говорит еще твоя документация?
Много чего.
Vi писал(а):На каком языке вообще написан драйвер?
Подозреваю, что на Delphi. Этот язык в фирме-разработчике любят, судя по всему.
Vi писал(а):Есть ли прототип для С/С++, который проще может быть переведен на VB?
С-call? Нет.
Повторюсь, если для кого-то это не очевидно: я не ищу метода решения задачи любой ценой - задача уже решена. Мною движет академический интерес. Вдруг кто-то из посетителей форума сталкивался с подобной проблемой или просто знает более красивые способы её решения. Впрочем, похоже, что таких нет.
Листинги не горят!


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

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

Сейчас этот форум просматривают: С.Т., PetalBot и гости: 11

    TopList