IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Delphi DLL и MS VC++. Почти безнадежный случай. (https://www.imho.ws/showthread.php?t=40023)

BigFoot 02.10.2003 09:51

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 нет возможности.
Идеи будут? :confused:

Madness 02.10.2003 19:29

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

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

>typedef ULONG (*MYPROC)(ULONG,LPCSTR);
Не знаю полностью синтаксиса VC, но возможно в этом проблема. В Делфи стек чистит вызываемая процедура, в Си - вызывающая + разный порядок заталкивания параметров на стек. От сюдова и пляши, тут проблема.

BigFoot 03.10.2003 13:00

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

Madness 04.10.2003 15:31

BigFoot
Попробуй:
typedef ULONG (__stdcall *MYPROC)(ULONG,LPCSTR);
Вместо __stdcall попробуй еще __pascal.
С синтаксисом си я знаком мало, мож кто поправит.

SpacerV 24.10.2003 20:24

BigFoot

ИМХО:

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

2) Другое дело - это, то что скорее всего прока в Делфях была скомпилирована без использования "stdcall" директивы (т.е. несовместима с Windows/C: стек чистит сама прока, параметры передаются в прямом порядке). Тут скорее всего скомпилить тебе не удастся (в С нет средств, насколько я знаю, для таких фичей). Единственный (на мой взгляд) выход - это на асме самому забить параметры в стек, вызвать проку по адресу и не очищать стек.

BigFoot 28.10.2003 13:30

SpacerV
Спасибо за совет. Вызывал на асме.


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

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