imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 02.10.2003, 09:51     # 1
BigFoot
Junior Member
 
Регистрация: 16.12.2002
Сообщения: 64

BigFoot Путь к славе только начался
Question Delphi DLL и MS VC++. Почти безнадежный случай.

Проблема в следующем. Есть библиотека, написанная на 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 нет возможности.
Идеи будут?
BigFoot вне форума  
Старый 02.10.2003, 19:29     # 2
Madness
KpTeaM
 
Регистрация: 31.10.2002
Адрес: Russia
Пол: Male
Сообщения: 3 261

Madness СуперБогMadness СуперБогMadness СуперБог
Madness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБог
>Обратите внимание на отсутствие "decorade".
А хто это?

>Идеи будут?
Ну так оно тебе черным по-аглицки грит, что: different calling convention

>typedef ULONG (*MYPROC)(ULONG,LPCSTR);
Не знаю полностью синтаксиса VC, но возможно в этом проблема. В Делфи стек чистит вызываемая процедура, в Си - вызывающая + разный порядок заталкивания параметров на стек. От сюдова и пляши, тут проблема.
__________________
Над струнами вен моих
Лезвия осени,
Их сталь леденящая
В просинь рук просится...
©Темнозорь
Madness вне форума  
Старый 03.10.2003, 13:00     # 3
BigFoot
Junior Member
 
Регистрация: 16.12.2002
Сообщения: 64

BigFoot Путь к славе только начался
Madness
Пытался я в msdn разобраться. Перебрал все calling conventions, a сделать так ничего и не смог.
Просто на сколько я понял, в си'шной dll-библиотеке есть подсказка в виде измененного имени ф-ции (decoraded name) типа _12@MyFunc@1@2 которая подсказывает как описать прототип. Для каждой calling convention используется свой decorade. В msdn это есть.
В Делфи стек чистит вызываемая процедура, в Си - вызывающая + разный порядок заталкивания параметров на стек. От сюдова и пляши, тут проблема.
Это я уже понял. Вопрос в том как плясать?
BigFoot вне форума  
Старый 04.10.2003, 15:31     # 4
Madness
KpTeaM
 
Регистрация: 31.10.2002
Адрес: Russia
Пол: Male
Сообщения: 3 261

Madness СуперБогMadness СуперБогMadness СуперБог
Madness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБог
BigFoot
Попробуй:
typedef ULONG (__stdcall *MYPROC)(ULONG,LPCSTR);
Вместо __stdcall попробуй еще __pascal.
С синтаксисом си я знаком мало, мож кто поправит.
__________________
Над струнами вен моих
Лезвия осени,
Их сталь леденящая
В просинь рук просится...
©Темнозорь
Madness вне форума  
Старый 24.10.2003, 20:24     # 5
SpacerV
Guest
 
Сообщения: n/a

BigFoot

ИМХО:

1) Все эти декорейды - мелочь. Дело в том, что символ @ и цифры как раз и указывает сколько нужно чистить байт в стеке после вызова. Так что и без этого можно.

2) Другое дело - это, то что скорее всего прока в Делфях была скомпилирована без использования "stdcall" директивы (т.е. несовместима с Windows/C: стек чистит сама прока, параметры передаются в прямом порядке). Тут скорее всего скомпилить тебе не удастся (в С нет средств, насколько я знаю, для таких фичей). Единственный (на мой взгляд) выход - это на асме самому забить параметры в стек, вызвать проку по адресу и не очищать стек.
 
Старый 28.10.2003, 13:30     # 6
BigFoot
Junior Member
 
Регистрация: 16.12.2002
Сообщения: 64

BigFoot Путь к славе только начался
SpacerV
Спасибо за совет. Вызывал на асме.
BigFoot вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 18:53.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.