Win VS2008 соглашение о вызовах: Delphi DLL от C - PullRequest
2 голосов
/ 09 мая 2011

Из приложения c (VS2008, Win) я вызываю функцию в dll, написанной на Delphi в Borland. Функция работает, но после каждого вызова я получаю эту ошибку: «Значение ESP не было должным образом сохранено при вызове функции […]», что означает, что мое соглашение о вызовах неверно. Я не знаю Delphi и у меня нет полного кода dll, но я считаю, что это функция Delphi:

function translate(file1, file2: PChar):PChar; stdcall;
    ...
    Result:=PChar(c);
end;
exports
    translate; 

Соответствующая часть в c:

typedef char*(__stdcall *translate)(char*, char*);
translate MyTranslate;
...
MyTranslate = (translate)GetProcAddress(dll, "translate");
char* result = (*MyTranslate)(file1, file2);

Вместо __stdcall в c выше, я пробовал __cdecl и __fastcall, но я всегда получаю сообщение ESP. Кроме того, в коде функции Dephi функция, кажется, возвращает char *, но dll-документ говорит, что возвращает «true» или «false» (?). Таким образом, в c вместо «typedef char * ...» я пробовал «typedef BOOL ...»: тем не менее, я получаю сообщение ESP. Я знаю, что могу подавить сообщение в разделе «Базовые проверки времени выполнения» (см. здесь ), но я предпочел бы получить правильный синтаксис вызова. DLL сжимается с помощью UPX, но я не уверен, что это актуально (как я уже сказал, сама функция работает).

Ответы [ 2 ]

0 голосов
/ 18 июля 2011

Если dll использует Borland fastcall(EAX, EDX, ECX), а компилятор использует Microsoft fastcall(EAX, EDX), это может привести к быстрой потере синхронизации регистра ESP.

0 голосов
/ 16 июня 2011

Я считаю, что проблема в том, что ваше описание функции Delphi неверно.Все, что вы можете сделать, это правильно пометить функцию «translate» с помощью __stdcall.

Этот тип ошибки возникает, когда вы пытаетесь вызвать COM-объект в соответствии с одним описанием, а на самом деле у него другое.С COM-объектами это происходит потому, что на вашем компьютере может быть более одной версии COM-объекта, и загружается неправильная версия.Итак, это дьявольская проблема.

Но в вашем случае я считаю, что вы прекрасно знаете, откуда загружается ваша Delphi DLL.Поэтому я думаю, что это просто неправильный документ для этой конкретной версии DLL.

...