Главная страница
    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.004 c
15-1239899831
dmk
2009-04-16 20:37
2009.06.28
Интерфейс программиста


4-1211905850
dev
2008-05-27 20:30
2009.06.28
combobox


3-1222945535
aykorolev
2008-10-02 15:05
2009.06.28
Разработка сетевой БД


2-1242228171
GibiW
2009-05-13 19:22
2009.06.28
Функция "Сохранить как"


15-1240480713
12
2009-04-23 13:58
2009.06.28
А что это за копия этого сайта?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский