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