Mam ciężki orzech do zgryzienia...
Przykład:
type
TProcka = procedure(Param: Pointer); stdcall;
TKlasa = class(TObject)
procedure ProckaTworzaca;
procedure ProckaWywolywana(Param: Pointer);
end;
procedure JakiesWywolanie(Procka: TProcka); stdcall; external 'jakis.dll';
procedure TKlasa.ProckaTworzaca;
begin
JakiesWywolanie(@ProckaWywolywana);
end;
procedure TKlasa.ProckaWywolywana(Param: Pointer);
begin
// tutaj coś tam
end;
Produkuje to błąd:
[Error] Incompatible types: 'regular procedure and method pointer'
Nie przechodzi, ponieważ typ TProcka nie jest "of object" i jak się zrobi w poniższy sposób to działa:
type
TProcka = procedure(Param: Pointer); stdcall;
TKlasa = class(TObject)
procedure ProckaTworzaca;
end;
procedure JakiesWywolanie(Procka: TProcka); stdcall; external 'jakis.dll';
procedure TKlasa.ProckaTworzaca;
begin
JakiesWywolanie(@ProckaWywolywana);
end;
procedure ProckaWywolywana(Param: Pointer);
begin
// tutaj coś tam
end;
Po wyjęciu "ProckaWywolywana" z klasy wszystko jest ok, jednakże planuję utworzyć kilka obiektów tej klasy, z których każda, możliwe nawet, że równolegle, będzie korzystać z "ProckaWywolywana", z poziomu której potrzebuję mieć dostęp do danych obiektu, który utworzył wywołanie. Robiąc to według przykładu pierwszego jest wszystko ok, ale kompilator tego nie przepuszcza. W drugiej wersji musiałbym tworzyć jakąś tablicę obiektów, przesyłać dodatkowy parametr, a potem porównywać i wywoływać "kopię" procedury metodą w odpowiednim obiekcie.
TKlasa = class(TObject)
procedure ProckaTworzaca;
procedure KopiaProcki(Param: Pointer);
end;
procedure ProckaWywolywana(Param: Pointer);
begin
// tutaj muszę "odgnadnąć" z jakiego obiektu przyszło wywołanie
OdpowiedniObiekt.KopiaProcki(Param);
end;
A jest dość uciążliwe. Zna ktoś jakiś sposób na to? Chcę przekazać adres metody, a nie procedury, a w zasadzie metoda to tak czy siak procedura chyba, co nie?