Die Deklaration ist falsch, die von der
DLL exportierten Methoden sind nicht "of object"!
Mit deiner obigen Deklaration wird beim Aufruf ein zusätzlicher Parameter (Self) übergeben, den die
DLL aber nicht erwartet. Das bringt den Call-Stack durcheinander.
Ok, danke für den Hinweis. Tatsächlich sollte ich mir die Direktive "of object" mal noch genauer zu Gemüte führen, denn dass das automatisch zu einem "self"-Parameter führt, war mir jetzt nicht bewusst. Da bliebe jetzt noch die Frage offen, weshalb das zwar für
DLL-Funktionen weg bleiben
muss, bei Funktionen, die innerhalb des Delphi-Programms ausgetauscht werden, aber nicht weg bleiben
darf?! Da kommt dann nachher nämlich der Compiler-Fehler "Inkompatible Typen: 'Reguläre Prozedur und Methodenzeiger'".
Im Konkreten Fall deklariere ich sowas hier:
Delphi-Quellcode:
TErrCallback = procedure(const AMsg: string) of object;
FCallbackOnError: TErrCallback;
und belege die Variable FCallbackOnError dann mit der Prozedur:
Delphi-Quellcode:
// Deklaration
procedure ShowErrorMessage(const AMsg: string);
// Definition
procedure TFormClass.ShowErrorMessage(const AMsg: string);
begin
MessageDlg(AMsg, mtError, [mbOK], -1);
end;
Edit
Hab meine Frage glaub selbst beantwortet. Unten aufgeführter Link gibt da das entsprechende Stichwort:
Code:
Ein Methodenzeiger wird in Form zweier Zeiger codiert, von denen der erste die Adresse der Methode speichert, während der zweite eine Referenz auf das Objekt enthält, zu dem die Methode gehört.
http://docwiki.embarcadero.com/RADSt...zedurale_Typen