Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как выполнить вызов функции из исполняемого файла по ее адресу? [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" ни о чем не говорит.


Наверх

Титульная страница Поиск, карта сайта Написать письмо