| imho.ws |
![]() |
|
|
|
# 1 |
|
Junior Member
Регистрация: 16.12.2002
Сообщения: 64
![]() |
Проблема в следующем. Есть библиотека, написанная на Delphi. Экспортируются ф-кция, которая должна быть использована в VC
Dump of file My.dll File Type: DLL Section contains the following exports for My.dll 00000000 characteristics 0 time date stamp Thu Jan 01 03:00:00 1970 0.00 version 1 ordinal base 12 number of functions 12 number of names ordinal hint RVA name 1 0 00042E4C CheckString ............... Обратите внимание на отсутствие "decorade"... Проблема именно с этим. на си описываю прототип typedef ULONG (*MYPROC)(ULONG,LPCSTR); и импорт HINSTANCE hinstLib; unsigned int iResult; bool runTimeLinkSuccess = FALSE; MYPROC DllFunction; hinstLib = LoadLibrary("my"); LPCSTR Buffer="Just a string"; if (hinstLib!=NULL) { DllFunction = (MYPROC) GetProcAddress(hinstLib, "CheckString"); if (runTimeLinkSuccess = (NULL != DllFunction)) { if (DllFunction != NULL) { iResult=DllFunction(1,Buffer); } } } FreeLibrary(hinstLib); Запускаю на выполнение и в месте вызова ф-кции получаю "Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention." Пересобрать библиотеку с экспортом stdcall нет возможности. Идеи будут?
|
|
|
|
|
# 2 |
|
KpTeaM
Регистрация: 31.10.2002
Адрес: Russia
Пол: Male
Сообщения: 3 261
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
>Обратите внимание на отсутствие "decorade".
А хто это? >Идеи будут? Ну так оно тебе черным по-аглицки грит, что: different calling convention >typedef ULONG (*MYPROC)(ULONG,LPCSTR); Не знаю полностью синтаксиса VC, но возможно в этом проблема. В Делфи стек чистит вызываемая процедура, в Си - вызывающая + разный порядок заталкивания параметров на стек. От сюдова и пляши, тут проблема.
__________________
Над струнами вен моих Лезвия осени, Их сталь леденящая В просинь рук просится... ©Темнозорь |
|
|
|
|
# 3 |
|
Junior Member
Регистрация: 16.12.2002
Сообщения: 64
![]() |
Madness
Пытался я в msdn разобраться. Перебрал все calling conventions, a сделать так ничего и не смог. Просто на сколько я понял, в си'шной dll-библиотеке есть подсказка в виде измененного имени ф-ции (decoraded name) типа _12@MyFunc@1@2 которая подсказывает как описать прототип. Для каждой calling convention используется свой decorade. В msdn это есть. В Делфи стек чистит вызываемая процедура, в Си - вызывающая + разный порядок заталкивания параметров на стек. От сюдова и пляши, тут проблема. Это я уже понял. Вопрос в том как плясать?
|
|
|
|
|
# 4 |
|
KpTeaM
Регистрация: 31.10.2002
Адрес: Russia
Пол: Male
Сообщения: 3 261
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
BigFoot
Попробуй: typedef ULONG (__stdcall *MYPROC)(ULONG,LPCSTR); Вместо __stdcall попробуй еще __pascal. С синтаксисом си я знаком мало, мож кто поправит.
__________________
Над струнами вен моих Лезвия осени, Их сталь леденящая В просинь рук просится... ©Темнозорь |
|
|
|
|
# 5 |
|
Guest
Сообщения: n/a
|
BigFoot
ИМХО: 1) Все эти декорейды - мелочь. Дело в том, что символ @ и цифры как раз и указывает сколько нужно чистить байт в стеке после вызова. Так что и без этого можно. 2) Другое дело - это, то что скорее всего прока в Делфях была скомпилирована без использования "stdcall" директивы (т.е. несовместима с Windows/C: стек чистит сама прока, параметры передаются в прямом порядке). Тут скорее всего скомпилить тебе не удастся (в С нет средств, насколько я знаю, для таких фичей). Единственный (на мой взгляд) выход - это на асме самому забить параметры в стек, вызвать проку по адресу и не очищать стек. |