![]() |
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: |
>Обратите внимание на отсутствие "decorade".
А хто это? >Идеи будут? Ну так оно тебе черным по-аглицки грит, что: different calling convention >typedef ULONG (*MYPROC)(ULONG,LPCSTR); Не знаю полностью синтаксиса VC, но возможно в этом проблема. В Делфи стек чистит вызываемая процедура, в Си - вызывающая + разный порядок заталкивания параметров на стек. От сюдова и пляши, тут проблема. |
Madness
Пытался я в msdn разобраться. Перебрал все calling conventions, a сделать так ничего и не смог. Просто на сколько я понял, в си'шной dll-библиотеке есть подсказка в виде измененного имени ф-ции (decoraded name) типа _12@MyFunc@1@2 которая подсказывает как описать прототип. Для каждой calling convention используется свой decorade. В msdn это есть. В Делфи стек чистит вызываемая процедура, в Си - вызывающая + разный порядок заталкивания параметров на стек. От сюдова и пляши, тут проблема. Это я уже понял. Вопрос в том как плясать? :rolleyes: |
BigFoot
Попробуй: typedef ULONG (__stdcall *MYPROC)(ULONG,LPCSTR); Вместо __stdcall попробуй еще __pascal. С синтаксисом си я знаком мало, мож кто поправит. |
BigFoot
ИМХО: 1) Все эти декорейды - мелочь. Дело в том, что символ @ и цифры как раз и указывает сколько нужно чистить байт в стеке после вызова. Так что и без этого можно. 2) Другое дело - это, то что скорее всего прока в Делфях была скомпилирована без использования "stdcall" директивы (т.е. несовместима с Windows/C: стек чистит сама прока, параметры передаются в прямом порядке). Тут скорее всего скомпилить тебе не удастся (в С нет средств, насколько я знаю, для таких фичей). Единственный (на мой взгляд) выход - это на асме самому забить параметры в стек, вызвать проку по адресу и не очищать стек. |
SpacerV
Спасибо за совет. Вызывал на асме. |
| Часовой пояс GMT +4, время: 18:55. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.