Узнать параметры функции в Native DLL

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

Узнать параметры функции в Native DLL

Сообщение grindars » 16.06.2006 (Пт) 16:08

Сабж. Есть TV тюнер Behold TV 507 RDS с поддержкой пульта управления. Есть DLL BeholdRC.dll, которая этим пультом управляет. Она экспортирует функции:
Код: Выделить всё
GetCardCount
GetCardName
GetRemoteCode
GetRemoteType
OpenCard
UnInit

Если ли способ узнать параметры функций (кроме дизасма длл или проги ее юзающей)?

PS DLL не выкладываю, т.к. наверное не имею права.

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

Сообщение GSerg » 16.06.2006 (Пт) 16:10

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

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 16:11

Как быстро ответил :-)
Доку я не видел. Я блокнотом таблицу глянул :-)

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

Сообщение GSerg » 16.06.2006 (Пт) 16:21

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

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 16:23

Признаюсь честно: искал плохо :-) удалось найти сишные прототипы...
Код: Выделить всё
int __stdcall GetRemoteCode(void);

BOOL __stdcall OpenCard(ULONG ulCardIdx);

BOOL __stdcall UnInit();

а что означает __stdcall ? я на си писал, но такое не юзал...
Последний раз редактировалось grindars 16.06.2006 (Пт) 16:26, всего редактировалось 1 раз.

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

Сообщение tyomitch » 16.06.2006 (Пт) 16:25

__stdcall означает, что тебе удастся её вызвать из VB :-)
Изображение

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

Сообщение GSerg » 16.06.2006 (Пт) 16:26

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

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 16:27

а разве это не когда она в бинарнике зовется _имя@

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 16:34

Сделал так:
Код: Выделить всё
Private Declare Function GetRemoteCode Lib "beholdrc.dll" () As Integer
Private Declare Function OpenCard Lib "beholdrc.dll" (uCardIdx As Long) As Integer
Private Declare Function UnInit Lib "beholdrc.dll" () As Integer

Private Sub Form_Load()
MsgBox OpenCard(0)
End Sub

На что получил: Run-time error '49': Bad DLL calling convetion

:(

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

Сообщение GSerg » 16.06.2006 (Пт) 16:44

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

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 16:50

ошибка осталась...

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

Сообщение GSerg » 16.06.2006 (Пт) 16:57

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

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 17:05

Мне код не очень удобно давать, на этом компе Linux, а на другом VB...
Private Declare Function GetRemoteCode Lib "beholdrc.dll" () As Long
Private Declare Function OpenCard Lib "beholdrc.dll" (ByVal cardIdx As Long) As Long
Private Declare Function UnInit Lib "beholdrc.dll" () As Long
может не везде надо было ставить long, но не думаю что изза этого.. ведь код возврата все равно через eax идет

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

Сообщение GSerg » 16.06.2006 (Пт) 17:10

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

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 17:20

может чем поможет... пасс - мой ник

вложение убрал
Последний раз редактировалось grindars 16.06.2006 (Пт) 17:34, всего редактировалось 1 раз.

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

Сообщение GSerg » 16.06.2006 (Пт) 17:29

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

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 17:36

раз говорит Bad DLL calling convetion, значит не stdcall :( зато нашел официальный API: http://tuner.beholder.ru/files/BeholdRC_v12.zip . Пример работает...

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

Сообщение GSerg » 16.06.2006 (Пт) 17:39

grindars писал(а):раз говорит Bad DLL calling convetion, значит не stdcall

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

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 17:41

GSerg писал(а):Конвенция вызова.
Одна из.

VB совместим только с stdcall? значит там не stdcall и библа не совместима с VB

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

Сообщение GSerg » 16.06.2006 (Пт) 17:45

GSerg писал(а):таким образом, либо она не __stdcall, либо у неё нет параметров.



grindars писал(а):VB совместим только с stdcall?

Через tlb - не только (хотя IDE рухнет).
Через вызов по указателю - с чем угодно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

grindars
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 75
Зарегистрирован: 12.10.2005 (Ср) 12:42
Откуда: Москва

Сообщение grindars » 16.06.2006 (Пт) 17:49

ну тогда завтра может попробую через LoadLibrary/GetProcAddress ...

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 16.06.2006 (Пт) 20:59

А если отдебажить прогу, использующую DLL, и посмотреть, как вызываются ф-и из DLL? Ну там, что в стек кладётся, что в регистрах лежит... Правда геморно это всё, лучше доку почитать.
Подпись проходит рефакторинг


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

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

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

    TopList