Об использовании ДЛЛ

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

Об использовании ДЛЛ

Сообщение Nick Bober » 16.12.2004 (Чт) 16:09

Народ, напомните склерознику, ДЛЛ с какой декларацией экспорта пользует VB6 через Declare? cdecl или pascal?

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

Сообщение GSerg » 16.12.2004 (Чт) 17:16

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

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 16.12.2004 (Чт) 17:19

Коротко и по теме. Спасибо.

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

Сообщение tyomitch » 16.12.2004 (Чт) 18:04

GSerg писал(а):stdcall aka PASCAL

А с чего ты взял, что это одно и то же?
В pascal параметры передаются в другом порядке.
http://weblogs.asp.net/oldnewthing/arch ... 47184.aspx

Стыд и позор :!:
Изображение

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

Сообщение GSerg » 16.12.2004 (Чт) 18:10

Ааааа, вот ты и попался :twisted:
Не читал http://www.vbstreets.ru/Articles/66044.aspx :?: :twisted:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 16.12.2004 (Чт) 18:24

Читал, но не нашёл там утверждений о взаимоотношении pascal и stdcall.
Так куда я попался-то? :-?
Изображение

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 16.12.2004 (Чт) 18:28

По моему имеется ввиду это:
даже открыл проект dll в VS 2003 .NET и специально посмотрел, каким образом трактуется PASCAL. VS однозначно ответила: #define PASCAL __stdcall

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

Сообщение GSerg » 16.12.2004 (Чт) 18:29

Для начала обратите внимание, что все мои функции используют директиву PASCAL(устаревшая директива), а не __stdcalll(это сделано потому, что компиляторы частот изменяют имена экспортируемых функций), но Сергей этого не заметил.
Сергей это заметил. Более того, Сергей даже открыл проект dll в VS 2003 .NET и специально посмотрел, каким образом трактуется PASCAL. VS однозначно ответила: #define PASCAL __stdcall После этого Сергей немного дизассемблировал эту библиотеку, и, бегло пробежавшись по командам вида mov eax, [esp+0x04], убедился, что параметры передаются по соглашению stdcall. Потому что первый параметр функции (это который "что вызываем", ну который ещё сравнивается с 0, 1 и 2...) там имел вид как раз [esp+0x04], значит, он был первым; значит, это stdcall... Ладно, хватит доказательств - уверен, что вам хватило и первого #define
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 16.12.2004 (Чт) 18:36

Тогда, похоже, PASCAL и pascal - разные вещи... Потому что у Чена написано:
Pascal does not support functions with a variable number of parameters, so it can use the callee-clean convention. Parameters are pushed from left to right, because, well, it seemed the natural thing to do. Function name decoration consists of conversion to uppercase. This is necessary because Pascal is not a case-sensitive language.



Ну, и ещё подтверждение. http://www.google.com/search?hl=en&q=pa ... cl+stdcall , первая ссылка: http://www.howtodothings.com/showarticl ... rticle=285
Register/Pascal:

These conventions pass parameters (of procedure/function) from left to right. The leftmost parameter is evaluated and passed first and the rightmost parameter is evaluated and passed last.

Cdecl/stdcall/safecall:

These conventions pass parameters from right to left. The rightmost parameter is evaluated and passed first and the leftmost parameter is evaluated and passed last.



В завершение, в IDL определены именно эти три конвенции: pascal, cdecl и stdcall. Уже отсюда следует, что это не одно и то же. (В енуме CALLCONV им соответствуют разные значения).
Изображение

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

Сообщение GSerg » 16.12.2004 (Чт) 18:59

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

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

Сообщение tyomitch » 16.12.2004 (Чт) 19:42

GSerg писал(а):Ага, pascal и PASCAL вещи разные :)
Ок, об этой разнице я действительно не знал :oops:
А ты? ;-)


Ещё, кстати, Nick спрашивал про pascal, а ты ответил про PASCAL... Путаница напрашивалась сама собой.
Изображение

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

Сообщение GSerg » 17.12.2004 (Пт) 3:59

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

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

Сообщение tyomitch » 17.12.2004 (Пт) 11:35

Нда... Развели меня, как лоха :oops: :oops:
Изображение

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 20.12.2004 (Пн) 19:46

Вот что я нашел в WinDef.h

#if (!defined(_MAC)) && ((_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED))
#define pascal __stdcall

и далее...
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall

Так что может эти вещи и не такие уж разные?

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

Сообщение GSerg » 21.12.2004 (Вт) 3:54

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

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 21.12.2004 (Вт) 11:29

К сожалению, Delphi не пользую и мануала не имею. Вот еще в тему из MSDN.
The __pascal, __fortran, and __syscall calling conventions are no longer supported. You can emulate their functionality by using one of the supported calling conventions and appropriate linker options.

WINDOWS.H now supports the WINAPI macro, which translates to the appropriate calling convention for the target. Use WINAPI where you previously used PASCAL or __far __pascal.


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

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

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

    TopList  
cron