function problem

9 отговора 376 прегледа
#1

function problem

как може да се изпълни функция като името и се изчита като стринг от база ?

Отговор
в отговор на sOlar1s #2

Re: function problem

Ами трябва функциите да са ти в DLL, да го заредиш с LoadLibrary и да ги викаш с GetProcAddress. Поне за това се сещам...

Отговор
в отговор на sOlar1s #4

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

Отговор
в отговор на NikB #5

Това се казва уникално решение!

Почти като да се почешеш с лявата ръка по дясното ухо, като внимаваш ръката да мине над главата! :))))

Редактирано от Formal на

Отговор
в отговор на Formal #6

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?

Отговор
в отговор на NikB #7

Re: Moga i po-unikalni reshenia da predloja

Напр аз искам:

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.

.
Ако процедурите са с параметри, решението е аналогично. Ако от базата се взима не низ, а число, очевидно е още по-лесно.

Отговор
в отговор на Formal #8

Vijdash li...

Vijdash li, znachi ima smisyl chovek da se opitva da se cheshe po razlichni nachini - moje i po-hubav da nameri


Отговор
в отговор на NikB #9

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.

Отговор
в отговор на sOlar1s #10

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.

Отговор