Помогите разобраться с DLL

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

Помогите разобраться с DLL

Сообщение sergei_l » 27.11.2006 (Пн) 0:16

Есть библиотека написанния в MS Visual C++. Мне нужно исопльзовать из нее функцию ReadParam. В руководстве по библиотеке есть такое предложение:
"bsa4f.dll - динамическая библиотека-расширение и поддерживает MFC интерфейс - экспортирует класс CbsaFunctions....".
Далее
"... программы имеют доступ только к функциям класса CbsaFunctions декларированных публичным способом..."
Одной из функций этого класса является функция ReadParam:
BOOL ReadPAram(DataCommPort *pDataPort, CStringArray*pStringArr);

описание типа DataCommPort
struct DataCommPort {
DWORD dwBaudRate;
BYTE nCom;
BYTE nError;
BYTE nLanguage;
};

Что я сделал:
Код: Выделить всё
Type pDataPort
    dwBaudRate As Long
    nCom As Byte
    nError As Byte
    nLanguage As Byte
End Type



Public Declare Function ReadParam2 _
Lib "bsa4f.dll" Alias "ReadParam" _
(ByVal pDataPort, ByVal pStringArr As String) As Long


dwBaudRate = 9600
nCom = 0
nError = 0
nLanguage = 3
'Call CBsaFunctions
x = ReadParam2(pDataPort, StrokA4)


При запуске получаю ощибку can't find DLL entry point .


Помогите, где я делаю ошибку?
Последний раз редактировалось sergei_l 27.11.2006 (Пн) 0:50, всего редактировалось 1 раз.

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 27.11.2006 (Пн) 0:36

BOOL __stdcall extern"C" ReadPAram(DataCommPort *pDataPort, CStringArray*pStringArr);
И соответсвенно имя в VBшном объявление нормальное поставить.

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 27.11.2006 (Пн) 0:51

_ae_ писал(а):BOOL __stdcall extern"C" ReadPAram(DataCommPort *pDataPort, CStringArray*pStringArr);
И соответсвенно имя в VBшном объявление нормальное поставить.



Извини за непонятливость, но можно ли поподробнее - это первый проект с использованием DDL библиотек...

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 27.11.2006 (Пн) 1:00

Что именно? Я привел какое нужно использовать объявление функции в C
А в VB6 потом надо просто убрать слово Alias и то, что за ним.

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 27.11.2006 (Пн) 1:05

_ae_ писал(а):Что именно? Я привел какое нужно использовать объявление функции в C
А в VB6 потом надо просто убрать слово Alias и то, что за ним.



Но библиотека в C уже написана (не мной) :cry: . Мне ее теперь нужно использовать, но не могу...


P.S. Вот что видно через PE Explorer:
Name:
?ReadParam@CBsaFunctions@@QAEHPAUDataCommPort@@PAVCStringArray@@@Z
Syntax Details
Undecorated C++ Function:
public: int __thiscall CBsaFunctions::ReadParam(struct DataCommPort *,class CStringArray *)

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 27.11.2006 (Пн) 1:22

А, ну тогда подставь в Alias строчку "?ReadParam@CBsaFunctions@@QAEHPAUDataCommPort@@PAVCStringArray@@@Z"

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 27.11.2006 (Пн) 1:26

_ae_ писал(а):А, ну тогда подставь в Alias строчку "?ReadParam@CBsaFunctions@@QAEHPAUDataCommPort@@PAVCStringArray@@@Z"


Спасибо, вроде как заработало.

А вроде, потому что теперь софтина вываливается при запуске функции...
Идеи есть? Или это вопрос к разработчику библиотеки? Или у меня еще какие-нибудь данные неправильно прописаны:
Описание типа DataCommPort там выше дано. А по поводу второго StringArray в мануале есть такой текст:
"pStringArr - типа CStringArray* - указатель к массиву стрингов, в который будут возвращены стоимости параметров"

Как образом в VB правильно описывается массив стрингов???
Последний раз редактировалось sergei_l 27.11.2006 (Пн) 1:29, всего редактировалось 1 раз.

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 27.11.2006 (Пн) 1:28

Ну дык, параметры, которые объявлены в Declare не имеют ничего общего с параметрами, которые ждет функция.

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 27.11.2006 (Пн) 1:32

_ae_ писал(а):Ну дык, параметры, которые объявлены в Declare не имеют ничего общего с параметрами, которые ждет функция.


Т.е. неправильного типа? Или названия должны быть другими?

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 27.11.2006 (Пн) 1:36

Неправильного типа.

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 27.11.2006 (Пн) 1:50

_ae_ писал(а):Неправильного типа.


Я подозреваю, что неправильно описан pStringArr, который по C должен быть CStringArray. А что соответстует CStringArray'ю в Visual Basic?

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 27.11.2006 (Пн) 1:54

Кажеться, ничего :?

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 27.11.2006 (Пн) 2:05

_ae_ писал(а):Кажеться, ничего :?


:?: Так а что-ж делать-то? :roll:

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

Re: Помогите разобраться с DLL

Сообщение Vi » 27.11.2006 (Пн) 8:36

sergei_l писал(а):Есть библиотека написанния в MS Visual C++. Мне нужно исопльзовать из нее функцию ReadParam. В руководстве по библиотеке есть такое предложение:
"bsa4f.dll - динамическая библиотека-расширение и поддерживает MFC интерфейс - экспортирует класс CbsaFunctions....".
Далее
"... программы имеют доступ только к функциям класса CbsaFunctions декларированных публичным способом..."
Одной из функций этого класса является функция ReadParam:
BOOL ReadPAram(DataCommPort *pDataPort, CStringArray*pStringArr);

Помогите, где я делаю ошибку?

С++ функция - член класса - имеет дополнительный параметр, т.е., грубо, С++-ное объявление
BOOL CbsaFunctions::ReadPAram(DataCommPort *pDataPort, CStringArray*pStringArr)
эквивалентно С-ному объявлению
BOOL ReadPAram(CbsaFunctions* pThis, DataCommPort *pDataPort, CStringArray*pStringArr)

Но это тебя все равно не спасет, потому что этой функции нужно передавать реальные адреса объектов CbsaFunctions и CStringArray, необходимых функции. И если ты их получишь откуда-нибудь, то тогда сможешь использовать эту функцию.

К тому же соглашение по вызову этой функции может не быть __stdcall, нужное VB. Ну точно
?ReadParam@CBsaFunctions@@QAEHPAUDataCommPort@@PAVCStringArray@@@Z == public: int __thiscall CBsaFunctions::ReadParam(struct DataCommPort *,class CStringArray *)

Резюме: облом.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 27.11.2006 (Пн) 14:04

Так что, учить C?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.11.2006 (Пн) 14:32

Угу. Выучить C++, скомпилировать для этой библы тонёхонькую COM-обёртку, и забыть C++ обратно. Устраивает? :-)
Изображение

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 27.11.2006 (Пн) 19:15

tyomitch писал(а):Угу. Выучить C++, скомпилировать для этой библы тонёхонькую COM-обёртку, и забыть C++ обратно. Устраивает? :-)


Спасибо за совет.
Главное чтобы не затянуло...

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

Сообщение Antonariy » 28.11.2006 (Вт) 10:40

Можно попросить знатока С++ за символические wm :) Аутсорсить.
Лучший способ понять что-то самому — объяснить это другому.

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 28.11.2006 (Вт) 13:31

Antonariy писал(а):Можно попросить знатока С++ за символические wm :) Аутсорсить.



Есть кандидатура? За символические? :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.11.2006 (Вт) 16:52

Если либа не сверхсекретная -- просто выкладывай сюда :-)
Изображение

sergei_l
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.11.2006 (Пн) 0:02

Сообщение sergei_l » 28.11.2006 (Вт) 20:44

В общем-то нет, не секретная.

Но что это даст? Идеи похоже иссякли...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 28.11.2006 (Вт) 21:35

Напишут COM-обёртку.
Изображение


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

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

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

    TopList  
cron