Как вызвать cdecl-функцию?

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

Как вызвать cdecl-функцию?

Сообщение Flora » 16.09.2004 (Чт) 19:40

Собственно САБЖ. Есть библиотека dll, надо вызвать содержащуюсю в ней функцию, а она требует декларацию cdecl, которую VB не поддерживает. Какие есть обходные варианты? Хорошо бы примерчик. Про callproc.dll - знаю. Но информации очень мало. Поможите кто знает.

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

Сообщение tyomitch » 16.09.2004 (Чт) 19:58

строится простенький асм-переходник, который будет вызывать нужную функцию и затем чистить стек.
примерный код:
Код: Выделить всё
mov eax, imm32 ; адрес функции
call eax
ret imm16

соответственно, это будет
B8 XXXXXXXX FF D0 C2 ZZZZ
XXXXXXXX - адрес твоей функции
ZZZZ - четырежды число её параметров
Изображение

Flora
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 16.09.2004 (Чт) 16:25
Откуда: Петербург

Сообщение Flora » 16.09.2004 (Чт) 22:13

Ой! Спасибо добрый человек. Я только не силен в асме. Можешь "на пальцах" объяснить? Как, где и куда что вставлять.

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

Сообщение tyomitch » 16.09.2004 (Чт) 22:31

Делаешь байтовый массив:
Код: Выделить всё
Dim b(0 To 9) As Byte
b(0) = &HB8
b(5) = &HFF
b(6) = &HD0
b(7) = &HC2
CopyMemory b(1), CLng(адрес_функции), 4
CopyMemory b(8), CInt(число_параметров), 2

а как его потом запустить - читай статью и посты GSerg-а.
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 16.09.2004 (Чт) 23:26

Что за бред. Вызываемая функция сама почистит стек за собой. Ему всего лишь нужно её вызвать.

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

Сообщение tyomitch » 16.09.2004 (Чт) 23:48

BP, заголовок топика прочитай внимательно.
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 17.09.2004 (Пт) 4:52

Я внимательно прочитал. А ты?

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

Сообщение tyomitch » 17.09.2004 (Пт) 10:47

Я - да, а ты прочитай http://msdn.microsoft.com/library/en-us ... ntions.asp , чтобы узнать, чистит ли cdecl-функция стек за собой.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.09.2004 (Пт) 12:42

Выыы ещоооо паааа-дееериии-тесь, гооо-ряя-чиее фиии-нскииие пааа-рниии :)
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение GSerg » 17.09.2004 (Пт) 13:38

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

Flora
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 16.09.2004 (Чт) 16:25
Откуда: Петербург

Сообщение Flora » 17.09.2004 (Пт) 14:11

Код на паскале:


function LoadDriver : Longbool; cdecl;
function LoadDriver; external 'eTransport.dll' name 'LoadDriver';
function HVOn: Longbool;cdecl;
function HVOn; external 'eTransport.dll' name'HVOn';

procedure TForm1.ButtonLoadDriverClick(Sender: TObject);
begin
LoadDriver;
ButtonHVOnClick(nil);
end;

procedure TForm1.ButtonHVOnClick(Sender: TObject);
begin
HVOn;
end;




Код на Визуал Бэйсике:


Public Declare Function LoadDriver Lib "eTransport.dll" () As Boolean
Public Declare Function HVOn Lib "eTransport.dll" () As Boolean

Private Sub Form_Load()
Call LoadDriver
End Sub

Private Sub Command_OnHV_Click()
Call HVOn
End Sub


Так вот: Код на паскале работает, а на VB - не работает. Можно примерчик, а то с асемблером не могу разобраться.

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

Сообщение tyomitch » 17.09.2004 (Пт) 16:24

Если твои функции и вправду без параметров, то всё должно работать; ошибка в чём-то другом.
Изображение

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

Сообщение GSerg » 17.09.2004 (Пт) 17:43

Для справки...
Longbool 4 байта, boolean 2.
Объяви-ка как long.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

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

    TopList  
cron