Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1241885395
barbaroska
2009-05-09 20:09
2009.06.28
Обработчик окончания изменения размеров окна..


2-1242128203
Дмитрий
2009-05-12 15:36
2009.06.28
Пара вопросов по компоненту Memo.


2-1241152560
Мистер Х
2009-05-01 08:36
2009.06.28
Как реализовать "Найи далее..."


15-1240437869
NailMan
2009-04-23 02:04
2009.06.28
Процентные соотношения. Какие правила?


3-1222785107
Kelly
2008-09-30 18:31
2009.06.28
выполнение sp с параметрами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский