Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
6-15187
brestmarket
2002-11-06 14:25
2003.01.06
WebBrowser1.ExecWB(OLECMDID_PRINTPREVIEW, 0) в свернутом виде?!


6-15206
nickolayLI
2002-11-05 14:32
2003.01.06
как отловить сообщение


4-15365
Stainer
2002-11-19 16:36
2003.01.06
Клик по popup menu


1-15010
viper
2002-12-24 12:39
2003.01.06
dbgrid


14-15294
denisac
2002-12-04 10:38
2003.01.06
Работа началась!!!





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