Wywołanie procedury po jej adresie...

0

Witam czy istnieje taka możliwość jak w temacie.
Widzę to jakoś tak że programista korzystając z
mojej klasy zdefiniuje własną procedurę i wprowadzi
jej adres do mojej procedury jako argument (mniej
więcej tak jak w CreateThread) a później moja
procedura ją wywoła, kiedy będzie to potrzebne...

No i jeśli to możliwe to jak wykonać to wywołanie ?

Wiem że w przypadku komponentów są zdarzenia, ale
ta klasa ma działać w czystym API...

0

Hmmm... z ASM nie mam nic wspólnego ale strzeliłem i trafiłem
za pierwszym razem :-D

procedure Proc(P: PChar); stdcall;
begin
  MessageBox(0,P,'',0);
  FreeMem(P);
end;

procedure Test(lpStartAddress: Pointer; lpParameter: Pointer);
asm
  call EAX; // to mój debiut
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  Tab = 'DUPA'#0;
var
  Text: PChar;
  Crdnl: Cardinal;
begin
  GetMem(Text, 5);
  Move(Tab, Text^, 5);
  CreateThread(nil, 0, @Proc, Text, 0, Crdnl);
  Test(@Proc, Text);
end;

Teraz mam pytanie, jak jeszcze przesłać tam parametr Text ?

0
type
TZwrotnaProcedura=procedure(CosTam:String);

teraz w klasie robisz jakąś zmienną typu TZwrotnaProcedura, której zostaje (np. w konstruktorze) przypisywany wskaźnik do funkcji.

procedure Przypisz(Funkcja:TZwrotnaProcedura);

potem po prostu wywołujesz funkcję za pomocą tamtej zmiennej

Funkcja('text');
0

Thx, thenkles, zaraz obadam, btw w końcu trafiłem jak to w asm zrobić ;-)

procedure MyCall(Proc, Param: Pointer);
asm
  push Param;
  call Proc;
end;
0

Hmm.... mam jeszcze jeden problem, nie wiem jak to nazwać:

type
  TProc = procedure(Klasa: TKlasa);
  TKlasa = class
  public
    procedure Test(P: TProc);
  end;
  //TProc tutaj też nie działa

Chodzi o to że w jakiej by tego kolejności nie dać to jest zawsze źle...

Co z tym zrobić ?

0

Nie możesz zrobić czegoś takiego, bo klasa odwóluje się do tego typu, a typ odwołuje się do klasy, czyli wychodzą odwołania w nieskończoność. Jeśli chcesz to zrobić w taki sposób, to proponuję zrezygnować w takim razie z typu proceduralnego i użyć po prostu czystych wskaźników. Czyli:

procedure przypisz(funkcja:pointer);
var
proc:procedure(text:string);
begin
@proc:=funkcja;
proc('tekst');
end;

wywołanie:

przypisz(@nazwa_funkcji)

Powinno chyba zadziałać.

0
type 
  procka=procedure(a:word;i:byte);
  funkcja=function(var s:string):boolean;

procedure a(i:word;j:byte);
begin
  //...
end;

function b(var t:string):boolean;
begin
  //...
end;


procedure costam(abc:procka;def:funkcja);
var
  s:string;
  b:boolean;
begin
  if(@abc<>nil)  // to tylko przykładowe zabezpieczenie
    then abc($ffff,$aa);
  if(@def<>nil)then b:=def(s);
end;

begin
  //...
  costam(a,b);
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1