Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit CallBack aus eigener DLL (https://www.delphipraxis.net/130489-probleme-mit-callback-aus-eigener-dll.html)

Net7 9. Mär 2009 12:46


Probleme mit CallBack aus eigener DLL
 
Hi,

habe die Beiträge im Forum, zu diesen Thema gefunden, allerdings kann ich diese nicht für mich nutzbar machen.

Ich habe eine Komponente die ein Callback aus einer Dll benötigt:

Code der Componente

Delphi-Quellcode:

Type
TSetFileNamesCallBack=procedure(MsgCallback: Pointer); stdcall;

...
type
MyCompo=class(TComponent)
private

SetFileNamesCallBack:TSetFileNamesCallBack;

function DllSagtWas;

...

constructor MyCompo.Create(AOwner: TComponent);
begin
FHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'meinedll'));
...
@SetFileNamesCallBack:= GetProcAddress(FHandle, 'SetFileNamesCallBack');
...

// Versuch 1

SetFileNamesCallBack(@DllSagtWas);
//geht nicht, da Variable fehlt??? Self?? (auch wenn ich die function DllSagtWas:boolean; stdcall;) so definiere.
 

// Versuch 2
SetFileNamesCallBack(TMyCompo.DllSagtWas);

// hier bekomme ich ein Callback, aber der läuft nicht richtig. Irgendwie ist bei meiner Komponente dann vieles Nil
// wenn ich z.b. aus MyCompo.DllSagtWas ein Event starten will

end;



function MyCompo.DllSagtWas:boolean;
begin
// gib laut
end;

dll
Delphi-Quellcode:

var
gFileNamesCallBack: function:boolean = nil ;

...

procedure SetFileNamesCallBack(MsgCallback: Pointer); stdcall;
begin
     @gFileNamesCallBack:=MsgCallback;
end;


... irgendwo im code
if assigned(gFileNamesCallBack) then
   begin
       // gib Laut
       gFileNamesCallBack;
   end;

exports

SetFileNamesCallBack;
Ich hab vieles probiert, aber irgendwas muss ja falsch laufen... bin für jeden Hinweis dankbar...

Mfg Net7

spaxxn 9. Mär 2009 13:25

Re: Probleme mit CallBack aus eigener DLL
 
Hast du dich in Bezug auf Callbacks schon mal mit Interfaces beschäftigt?

Net7 9. Mär 2009 13:32

Re: Probleme mit CallBack aus eigener DLL
 
Zitat:

Zitat von spaxxn
Hast du dich in Bezug auf Callbacks schon mal mit Interfaces beschäftigt?

Ja, allerdings Denke ich, das bei den wenigen Funktionen ein Interface wohl Overkill wäre.
Aber ich glaube Dich stört eher die direkte Pionterübergabe. Aber wenn das ein Hinweis ein soll werd ich mir ein Interface basteln ;)

Mfg Net7

spaxxn 9. Mär 2009 13:42

Re: Probleme mit CallBack aus eigener DLL
 
Sollte nur ein Anstoss sein. :)

Prozessübergreifende Callbacks werden auch noch interessant.

Blup 9. Mär 2009 13:49

Re: Probleme mit CallBack aus eigener DLL
 
var
gFileNamesCallBack: function(Self: Pointer):boolean = nil ;

Methoden erwarten immer den versteckten Parameter Self (Ausnahme Klassenmethoden), eventuell Aufrufkonventionen angeben.

Net7 9. Mär 2009 14:02

Re: Probleme mit CallBack aus eigener DLL
 
Zitat:

Zitat von Blup
var
gFileNamesCallBack: function(Self: Pointer):boolean = nil ;

Methoden erwarten immer den versteckten Parameter Self (Ausnahme Klassenmethoden), eventuell Aufrufkonventionen angeben.

Hab ich schon versucht, ändert aber nichts. Zumal gFileNamesCallBack: function(Self: Pointer):boolean = nil ; stdcall nicht funktioniert und eine DLL stdcall eh fordert.

Mfg Net7

sirius 9. Mär 2009 15:54

Re: Probleme mit CallBack aus eigener DLL
 
Zitat:

Zitat von Net7
und eine DLL stdcall eh fordert.

Nö. Die DLL legt das bei der Implementation einfach fest und alle anderen müssen sich daran anhalten.


Zitat:

Zitat von Net7
Hab ich schon versucht, ändert aber nichts. Zumal gFileNamesCallBack: function(Self: Pointer):boolean = nil ; stdcall nicht funktioniert

Die Richtung von Blup war schon richtig. Aber man muss ja als Self etwas sinnvolles übergeben bzw. gleich einen Methodenzeiger speichern:
Delphi-Quellcode:
var
gFileNamesCallBack: function:boolean of object;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz