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

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

Как запустить процедуру знаяя ее адрес? [Win95/98]


alex134 ©   (2002-12-20 22:19:00) 

p:=GetProcAddress(..,..);
Как теперь запустить процедуру, на которую указывает p ?


alex134   (2002-12-22 00:31:00) [1]

Ветка плавно перешла в http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1040215113&n=5, думаю, проблема не в вызове функции а в самой подмене АПИ-функции.
Модератор! Удалите плз эту ветвь/


alex134   (2002-12-22 00:22:00) [2]

Короче, сделал так:

function h_LoadLibraryA(lpLibFileName: PChar): HMODULE; stdcall; {Ansi}
var
f : function (lpLibFileName1: PChar): HMODULE; stdcall;
begin
@f:=OldAddr;
result:=f(lpLibFileName);
LogStr(lpLibFileName+" called faked! "+"result="+IntToStr(result)+" addr="+inttostr(longword(OldAddr)));
end;

ГДЕЕЕтут ошибка? Какого хрена "программа выполнила недопустимую операцию и будет закрыта"!!! Причем это сообщение возникает 4 раза, каждый раз я нажимаю "закрыть", а в итоге оно запускается и нормально работает. LogStr не при делах - пробовал, убирал ее. Где ???????? Нашла коса на камень :(


Bosh   (2002-12-21 23:45:00) [3]

насколько мне известно функции возращают свой результат в регистре eax. Пример это простая фунции

function summa(a,b:integer):integer;
begin
result (a+b);
end;

откопилировшись это будет выглядеть так

summa (a,b:inteher)
mov ebx,,[bp+смешение на параметр1]
add ebx,[bp+смешение на параметр2]
// результат в регистре eax;
ret


вроде так)


Anatoly Podgoretsky   (2002-12-21 23:37:00) [4]

Соглащение о вызовах описывает как передаются параметры и кто очищает стек, тема в хелпе calling conventions
Процедурные типы в букварях и хелпе тема procedural types


brat   (2002-12-21 23:24:00) [5]

мда далеко залез ты
лана показываю на твоей процедуре,stdcall-это означает что параметры передаются как в языке С - сначала последний потом первый ,а стек очищает вызвавшая процедура(если память мне не изменяет). Параметры передаются в стеке. Для помещения пареметра в стек есть комадна push для выбборки из стека pop.

function h_LoadLibraryA(lpLibFileName: PAnsiChar): HMODULE; stdcall;
var
p : dword;
begin
...
//GlobalData^.P : pointer - содержит "реальный" адрес LoadLibrarA
...
p:=integer(GlobalData^.P);
asm
push paramN;//загоняешь параметры в стек
push param1;
push param0;
call p; //вызвал процедуру, она отработалa и вернула
// управление, и стек очистила
//результат функции вовзвращается зачастую в EAX
end;
Result:=???
end;

это присвивание верно mov res,EAX; если res 32 разрядное целое число если нет то при присваивание нужно делать принудительное привидение типов byte ptr (это если res байтового типа).


alex134   (2002-12-21 18:08:00) [6]

От простого к сложному ...
1) Как считать результат из EAX в переменную?
mov res, EAX? В книге сказано, что приемник не может быть операндом :(
2) Чем важен процедурный тип ?
3) Со стеком вообще беда. Как узнать, где этот стек ? Чего мне туда написать перед вызовом LoadLibraryA ?


Anatoly Podgoretsky   (2002-12-21 16:58:00) [7]

LoadLibrarA имеет параметры и ты должен их загнать в стек иначе проблемы, а результат будет возвращен через EAX
Обрати внимание на процедурный тип


alex134   (2002-12-21 16:11:00) [8]

Сделал так

function h_LoadLibraryA(lpLibFileName: PAnsiChar): HMODULE; stdcall;
var
p : dword;
begin
...
//GlobalData^.P : pointer - содержит "реальный" адрес LoadLibrarA
...
p:=integer(GlobalData^.P);
asm
call p;
end;
Result:=???
end;


PVOzerski   (2002-12-21 12:05:00) [9]

Я не очень понимаю, чем Вас предложенный способ не устраивает...
Ну хорошо, например, так:
var
p:pointer;
f:function(....):... absolute p;

или

var
xxx:record
case integer of
0:(p:pointer);
1:(f:function(....):... );
end;
Присваиваем к p, вызываем f.


alex134   (2002-12-21 11:37:00) [10]

А есть другие способы ?


alex134   (2002-12-20 22:40:00) [11]

Tnks!


Song   (2002-12-20 22:26:00) [12]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1040202639&n=4


Наверх

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