Hallo,
ich möchte ein Callback zusammen mit einer dynamisch geladenen
DLL behandeln und habe folgenden Test-Code
Delphi-Quellcode:
unit u_IntDll;
interface
uses
Winapi.Windows;
type
TCallbackProcedure =
procedure(Msg:
string);
stdcall;
TSetCallbackProc =
procedure(ACallbackProc: TCallbackProcedure);
stdcall;
TEnableDllTimer =
procedure(AEnabled: boolean);
stdcall;
TMyMsgEvent =
procedure(Msg:
string)
of object;
TintDll =
class
private
FDLLHandle: THandle;
FOnMyMsg: TMyMsgEvent;
MyCallbackProc: TSetCallbackProc;
MyEnableDllTimer: TEnableDllTimer;
procedure ShowDLLMessage(sMsg:
String);
stdcall;
public
constructor Create;
destructor Destroy;
override;
property OnMyMsg: TMyMsgEvent
read FOnMyMsg
write FOnMyMsg;
procedure Init;
procedure EnableDllTimer(bValue: boolean);
end;
procedure ShowDLLMessageExt(sMsg:
string);
stdcall;
var
intDll: TintDll;
implementation
procedure ShowDLLMessageExt(sMsg:
string);
stdcall;
begin
if assigned(intDll.OnMyMsg)
then
intDll.OnMyMsg(sMsg);
end;
{ TintDll }
constructor TintDll.Create;
begin
end;
destructor TintDll.Destroy;
begin
FreeLibrary(FDLLHandle);
inherited;
end;
procedure TintDll.EnableDllTimer(bValue: boolean);
begin
MyEnableDllTimer(bValue);
end;
procedure TintDll.Init;
begin
FDLLHandle := LoadLibrary('
Callback.dll');
if FDLLHandle <> 0
then
begin
@MyEnableDllTimer := GetProcAddress(FDLLHandle, '
EnableDllTimer');
@MyCallbackProc := GetProcAddress(FDLLHandle, '
CallbackProc');
MyCallbackProc(ShowDLLMessageExt);
end;
end;
procedure TintDll.ShowDLLMessage(sMsg:
String);
begin
if assigned(intDll.OnMyMsg)
then
intDll.OnMyMsg(sMsg);
end;
end.
Weise ich im Init-Part
MyCallbackProc(ShowDLLMessageExt);
zu, funktioniert das Ganze einwandfrei.
Möchte ich aber alles innerhalb der Klasse behandeln und weise
MyCallbackProc(ShowDLLMessage);
zu, bekomme ich die Meldung "Inkompatible Typen: Reguläre Procedure und Methodenzeiger"
Mir ist nicht ganz klar, was der Unterschied zwischen dem Handling von ShowDLLMessageExt und ShowDLLMessage ist. Was muss ich machen, dass ich auch den Callback innnerhalb der Klasse behandeln kann?
Grüße
Gerd