Bonjour à tous,
voilà depuis ce matin j'étais confronté à la problématique suivante
1) Je construit une dll delphi qui marche très bien par ailleurs.
2) celle-ci abrite un socket tcp
3) sur ce socket j'ai des retour d'évennements de type onafterconnect etc...
Probleme, commet l'application cliente de la dll (non delphi) peut recevoir l'évennement
Voici la solution que j'ai utilisé: création d'un callback dans la dll
1) création d'un type pour mon callback
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Type TConnectCallBack = procedure (i: integer);stdcall;
2)J'ai une procedure Registercallback qui permet de stoquer l'adresse de la procedure cliente (je crois)
Et enfin, lorsque j'ai mon event qui est déclanché...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Var ZConnectCallBack : TConnectCallBack; //déclaration... procedure RegisterConnectCallBack(ThisCallBack:TConnectCallBack);stdcall; //implémentation.. procedure RegisterConnectCallBack(ThisCallBack:TConnectCallBack);stdcall; begin ZConnectCallBack:=ThisCallBack; end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 procedure TDB9Connector.OnAfterConnect(Sender: TObject); begin FConnected:=true; showmessage('appel de callback'); ZConnectCallBack(integer(FConnected)); end;
Voici le pseudo code application "cliente"
Ca fonctionne... Quand l'event est déclenché dans la dll
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 //déclaration du type callback (pointeur sur une fonction?) Type TConnectCallBack = procedure (i:integer);stdcall; (...) //déclaration de la procedure de test var procedure TestCallBack(i:integer);stdcall; (...) //déclaration du register procedure RegisterCallBack(ThisCallBack:TConnectCallBack);stdcall;external aDll name 'RegisterConnectCallBack'; (...) //Appel du register procedure TForm1.Button2Click(Sender: TObject); begin RegisterCallBack(TestCallBack); end; (...) //implementation du callback procedure TestCallBack(i: integer); begin Showmessage('Callback' + inttostr(i)); end;
ma procédure TestCallBack est appelée dans l'application cliente.
et je récupère la valeur de i;
Si vous voyez une erreur flagrante dans mon code ou un moyen de l’améliorer, n’hésitez pas à me le faire savoir.
Et euhhh. Si quelqu'un sait comment utiliser cette dll sous windev (déclaration du callback et tout... ben je suis tout à fait ouvert à une discussion sur le sujet)
Merci d'avance.
Passez une bonne journée
Partager