function problem
9 отговора
376 прегледа
Re: function problem
Ами трябва функциите да са ти в DLL, да го заредиш с LoadLibrary и да ги викаш с GetProcAddress. Поне за това се сещам...
Re: function problem
I az iskam da mi vikat pich :-)
Registrirash stringowete s RegisterWindowMessage v programata si; kato prochetesh string ot bazata pak vikash RegisterWindowMessage i poluchavash identifikatora na syobstenieto; Pravish PostMessage; Prihvashash go (naprimer s Hook).
Nai-malkoto - mojesh da probvash
Registrirash stringowete s RegisterWindowMessage v programata si; kato prochetesh string ot bazata pak vikash RegisterWindowMessage i poluchavash identifikatora na syobstenieto; Pravish PostMessage; Prihvashash go (naprimer s Hook).
Nai-malkoto - mojesh da probvash
Това се казва уникално решение!
Почти като да се почешеш с лявата ръка по дясното ухо, като внимаваш ръката да мине над главата! :))))
Редактирано от Formal на
Moga i po-unikalni reshenia da predloja
Ami moga da predloja i drugi reshenia - predpolagam, ako si bryknesh po-dylboko v nosa, systo ste mojesh da si pocheshesh uhoto :-)
Bez maitap, mislish, che hooks ste prechat na proizvoditelnostta li, ili ne priznavash applications bez niakolko dll?
Bez maitap, mislish, che hooks ste prechat na proizvoditelnostta li, ili ne priznavash applications bez niakolko dll?
Re: Moga i po-unikalni reshenia da predloja
Напр аз искам:
.
Ако се използва PostMessage, процедурата X ще се изпълни, чак след като приключи процедурата Something, а това "прави още нещо" може да зависи от изпълнението на процедурата. Значи трябва този ефект да се заобикаля по някакъв начин.
Другият аргумент е, че RegisterWindowMessage прави търсене в таблица, което съвсем спокойно може да се направи и в нашата програма, като със сигурност ще се изпълнява по-бързо. Извикването на процедурата от указател със сигурност става по-бързо, отколкото с PostMessage и после да чакаш Windows да ти викне Hook-а. По твоя начин също трябва да се съобразяваш с точната декларация на Hook-а. Въобще според мен е по-лесно да се избягва API в този случай, например може:
.
Ако процедурите са с параметри, решението е аналогично. Ако от базата се взима не низ, а число, очевидно е още по-лесно.
Procedure Something;
begin
// чете низа от базата:
....
// изпълнява си процедурата X:
....
// прави още нещо:
....
end;
.
Ако се използва PostMessage, процедурата X ще се изпълни, чак след като приключи процедурата Something, а това "прави още нещо" може да зависи от изпълнението на процедурата. Значи трябва този ефект да се заобикаля по някакъв начин.
Другият аргумент е, че RegisterWindowMessage прави търсене в таблица, което съвсем спокойно може да се направи и в нашата програма, като със сигурност ще се изпълнява по-бързо. Извикването на процедурата от указател със сигурност става по-бързо, отколкото с PostMessage и после да чакаш Windows да ти викне Hook-а. По твоя начин също трябва да се съобразяваш с точната декларация на Hook-а. Въобще според мен е по-лесно да се избягва API в този случай, например може:
Unit Unit1;
Interface
Procedure ExecProc(ProcName : String);
Implementation
Procedure Proc1;
Begin
...
End;
Procedure Proc2;
Begin
...
End;
...
Procedure ProcX;
Begin
...
End;
Type
TProc = Procedure;
Const
Procs : Array[1..X] Of Record
Name : String;
Code : TProc;
End = (
(Name: 'Proc1'; Code: Proc1),
(Name: 'Proc2'; Code: Proc2),
....
(Name: 'ProcX'; Code: ProcX)
);
Procedure ExecProc(ProcName : String);
Var i : Integer;
Begin
For i := Low(Procs) To High(Procs) Do
If Procs[ i ].Name = ProcName Then Begin
Procs[ i ].Proc;
Exit;
End;
Raise ENeshto.Create('Procedure not found');
End;
end.
.
Ако процедурите са с параметри, решението е аналогично. Ако от базата се взима не низ, а число, очевидно е още по-лесно.
Vijdash li...
Vijdash li, znachi ima smisyl chovek da se opitva da se cheshe po razlichni nachini - moje i po-hubav da nameri

Re: Vijdash li...
А така няма ли да стане :
TSomeFunc = function(some_param:pointer):pointer;
function First(some_param:pointer):pointer;
function Second(some_param:pointer):pointer;
function Third(some_param:pointer):pointer;
....
var func_name:string;
my_func:TSomeFunc;
begin
//4etene ot bazata na imeto
func_name:=GetFunctionNameFromDB;
my_func:=nil;
if func_name = 'first' then my_func:=First
else func_name = 'second' then my_func:=Second
else func_name = 'third' then my_func:=Third
else Application.Terminate //:)))
//wikame fuknciqta
my_func(nil);
//moje i da sam obarkal nqkade ne6to , no ideqta q shvanahte, moje daje obekt4e da se spretne :)))
end;
Taka stava i bez dll , i bez hooks. A dali hook-te vredqt na proizvoditelnostta, ami mai da , no zavisi, vse pak , koi hook i kade obrabotva6 infoto.
TSomeFunc = function(some_param:pointer):pointer;
function First(some_param:pointer):pointer;
function Second(some_param:pointer):pointer;
function Third(some_param:pointer):pointer;
....
var func_name:string;
my_func:TSomeFunc;
begin
//4etene ot bazata na imeto
func_name:=GetFunctionNameFromDB;
my_func:=nil;
if func_name = 'first' then my_func:=First
else func_name = 'second' then my_func:=Second
else func_name = 'third' then my_func:=Third
else Application.Terminate //:)))
//wikame fuknciqta
my_func(nil);
//moje i da sam obarkal nqkade ne6to , no ideqta q shvanahte, moje daje obekt4e da se spretne :)))
end;
Taka stava i bez dll , i bez hooks. A dali hook-te vredqt na proizvoditelnostta, ami mai da , no zavisi, vse pak , koi hook i kade obrabotva6 infoto.
Re: function problem
Vuv vsichki sluchai shte se naloji da se tursi v nqkakva tablica s imena i adresi na funkcii. S DLL tova go pravi GetProcAddress, koqto pretursva export tablicata na DLL-a, s window msg-s go pravi pak API-to. A moje i sam da si realizirash tablicata. Samo che s GetProcAddress naistina shte stane naj-guvkavo, purvo shtoto e mnogo po-lesno extensible, i vtoro shtoto API-to se predpolaga che e dobre optimizirano - veroqtno tursneto e dvoichno, ili hashtable ili neshto takova.