Форум: "Начинающим";
Текущий архив: 2009.06.28;
Скачать: [xml.tar.bz2];
ВнизКак выполнить вызов функции из исполняемого файла по ее адресу? Найти похожие ветки
← →
Dimko_0 © (2009-05-07 21:40) [0]Кратко по сабжу: Имеется приложение с известным адресом подпрограммы (или функции) в нем. Эту функцию нужно вызвать из подключенной dll, написанной на дэльфи, передав в нее 1 параметр типа longint. Параметр передается через стек, сам стек не выравнивается (надо выравнивать вручную, функция не stdcall).
Адрес функции: $0043A0B6.
Выровнять стек наверно можно так:asm
add esp, 4
end;
Тут все просто, но как передать параметр? Ну или хотя бы поместить в стек... Я тут как всегда все запутал и накрутил много лишнего. Наверно должен быть способ проще...
← →
Сергей М. © (2009-05-07 22:04) [1]
> функция не stdcall
> как передать параметр?
Никак, пока не определишься с соглашением о вызове.
"не stdcall" ни о чем не говорит.
← →
Rouse_ © (2009-05-07 22:07) [2]
push Param
call $0043A0B6
add esp, 4
← →
Сергей М. © (2009-05-07 22:18) [3]
> Rouse_ © (07.05.09 22:07) [2]
Это ведь cdecl..
basm-вставка вовсе ни к чему для этого ..
← →
Dimko_0 © (2009-05-07 22:18) [4]
> push Param
о_0. А прямо в asm...end можно писать Param? Щас попробую, хотя сильно сомневаюсь))
> "не stdcall" ни о чем не говорит.
мдя? может я не в курсе, но мне казалось, что stdcall - это соглашение о том, что функция сама выравнивает за собой стек. Не stdcall соответственно не выравнивает. Или я не прав?
← →
Dimko_0 © (2009-05-07 22:20) [5]
> basm-вставка вовсе ни к чему для этого
во-во и мне так кажется. Может есть способ проще?
← →
Сергей М. © (2009-05-07 22:29) [6]
> мне казалось, что stdcall - это соглашение о том, что функция
> сама выравнивает за собой стек
stdcall гласит:
1. Параматры передаются через стек слева направо в порядке их перечисления в операторе вызова.
2, Результат, если подразумевается, возвращается через определенные регистры общего назначения.
3. За баланс стека отвечает вызываемая подпрограмма.
Если, как ты утверждаешь, стек не выравнивается при возврате из п/программы, это м.б., например, cdecl, который гласит:
1. Параматры передаются через стек cправа налево в порядке их перечисления в операторе вызова.
2, Результат, если подразумевается, возвращается через определенные регистры общего назначения.
3. За баланс стека отвечает вызывающая подпрограмма.
← →
Dimko_0 © (2009-05-07 22:31) [7]да не суть. Вы мне лучше с проблемой помогите)))
← →
Сергей М. © (2009-05-07 22:34) [8]
> Может есть способ проще?
Если это действительно cdecl, то
type
TSomeProc = procedure(SomeParam: TSomeGenericType); cdecl;
var
SomeProc: TSomeProc absolute $0043A0B6;
..
SomeProc(SomeParam);
← →
Rouse_ © (2009-05-07 22:38) [9]
> Это ведь cdecl..
> basm-вставка вовсе ни к чему для этого ..
Суть - я стараюсь ответить на вопрос, а не привести финальное решение :)
Доходить до решения, имхо, должен автор вопроса :)
← →
Dimko_0 © (2009-05-07 22:46) [10]гуд, всем спасибо. Сам бы я еще долго до решения доходил "сам". А с готовым решением все стало понятно и быстро.
А вот меня заинтерсовал asm end
Значит можно также и написать так? Очень интересно...ID := 443
asm
push dword ptr [ID]
call $0043A0B6
add esp, 4
end;
> Если это действительно cdecl
скорее всего так и есть - параметр всего лишь 1, порядок передачи не имеет значения. И "За баланс стека отвечает вызывающая подпрограмма."
В общем, с я разобрался, всем кто помог очень благодарен.))
← →
Германн © (2009-05-08 01:46) [11]
> А вот меня заинтерсовал asm end
> Значит можно также и написать так? Очень интересно...
> ID := 443
> asm
> push dword ptr [ID]
"О, сколько нам открытий чудных готовит..."
Документация, имхо , хоромает! Она хорошая, но хромает!
(с) Винни Пух.
← →
Сергей М. © (2009-05-08 08:15) [12]
> Значит можно также и написать так?
Ну наверно можно. Но использовать в этой ситуации basm резона действительно нет - компилятор справится с этой задачей сам и сгенерирует тот же самый машкод, достаточно указать ему соглашение.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.06.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c