2013-09-07 3 views
3

Извините, возможно, этот вариант также прост для программистов Delphi, но это не для меня. У меня есть функция библиотеки, которую я вызываю, и в основном она ест мой стек. Он делает это, нажимая переменные для функции в стек, но каким-то образом Delphi не выталкивает их из стека. Итак, после окончания функции я приземляюсь в никуда. Забавно, что я могу просто «поп-эакс» столько, сколько у меня есть параметров, и он работает. Может ли кто-нибудь пролить свет на то, что происходит? Рабочий код выглядит следующим образом:Вызов функции библиотеки съедает стек. Зачем?

function LoadIntoMemory(sdiPath: String): Integer; 
var 
    retValue: Integer; 
begin 
    retValue := file_open(PAnsichar(AnsiString(sdiPath)), @filedata, @filedatasize); 
    asm 
    pop eax 
    pop eax 
    pop eax 
    end; 
end; 

Как уже говорилось, не выскакивают из стека он выходит из строя.

функция сама по себе из C DLL, скомпонованы статически, как это:

function file_open (filename: PAnsichar; filedata: PPAnsichar; filedatasize: PLongInt): Integer; stdcall; external 'libLib'; 

ссылки динамически не изменяет поведение.

+7

Я бы попробовать "Cdecl". Не уверен, что это поможет, потому что порядок переменных изменится. – Arkady

ответ

0

Это соглашение о вызовах неправильно матч. Вызов - cdecl, а вызывающий использует stdcall. Ключевое различие заключается в том, кто очищает стек. Для stdcall это вызывающий, а для cdecl - вызывающий.

Это объясняет, что вы наблюдали. Фактической функцией является cdecl. И поэтому он не очищает стек. Но ваш код вызова считает, что функция stdcall и поэтому ожидает, что вызывающая сторона очистит стек. Таким образом, ни одна из сторон не очищает его.

Подробнее здесь: http://en.m.wikipedia.org/wiki/X86_calling_conventions

 Смежные вопросы

  • Нет связанных вопросов^_^