Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.28;
Скачать: CL | DM;

Вниз

Как выполнить вызов функции из исполняемого файла по ее адресу?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
15-1240605003
Юрий
2009-04-25 00:30
2009.06.28
С днем рождения ! 25 апреля 2009 суббота


15-1240751506
radium
2009-04-26 17:11
2009.06.28
Округление географических координат


2-1242203918
ply
2009-05-13 12:38
2009.06.28
как узнать установлены ли в системе программы?


3-1222849323
Александр999
2008-10-01 12:22
2009.06.28
Проверка на существование БД перед запуском приложения


15-1240900857
LiveCD
2009-04-28 10:40
2009.06.28
Выбор ОС