Форум: "Основная";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
ВнизКак запустить процедуру знаяя ее адрес? Найти похожие ветки
← →
alex134 (2002-12-20 22:19) [0]p:=GetProcAddress(..,..);
Как теперь запустить процедуру, на которую указывает p ?
← →
Song (2002-12-20 22:26) [1]http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1040202639&n=4
← →
alex134 (2002-12-20 22:40) [2]Tnks!
← →
alex134 (2002-12-21 11:37) [3]А есть другие способы ?
← →
PVOzerski (2002-12-21 12:05) [4]Я не очень понимаю, чем Вас предложенный способ не устраивает...
Ну хорошо, например, так:
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 16:11) [5]Сделал так
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;
← →
Anatoly Podgoretsky (2002-12-21 16:58) [6]LoadLibrarA имеет параметры и ты должен их загнать в стек иначе проблемы, а результат будет возвращен через EAX
Обрати внимание на процедурный тип
← →
alex134 (2002-12-21 18:08) [7]От простого к сложному ...
1) Как считать результат из EAX в переменную?
mov res, EAX
? В книге сказано, что приемник не может быть операндом :(
2) Чем важен процедурный тип ?
3) Со стеком вообще беда. Как узнать, где этот стек ? Чего мне туда написать перед вызовом LoadLibraryA ?
← →
brat (2002-12-21 23:24) [8]мда далеко залез ты
лана показываю на твоей процедуре,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 байтового типа).
← →
Anatoly Podgoretsky (2002-12-21 23:37) [9]Соглащение о вызовах описывает как передаются параметры и кто очищает стек, тема в хелпе calling conventions
Процедурные типы в букварях и хелпе тема procedural types
← →
Bosh (2002-12-21 23:45) [10]насколько мне известно функции возращают свой результат в регистре 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
вроде так)
← →
alex134 (2002-12-22 00:22) [11]Короче, сделал так:
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 не при делах - пробовал, убирал ее. Где ???????? Нашла коса на камень :(
← →
alex134 (2002-12-22 00:31) [12]Ветка плавно перешла в http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1040215113&n=5, думаю, проблема не в вызове функции а в самой подмене АПИ-функции.
Модератор! Удалите плз эту ветвь/
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c