PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Comment obtenir l'adresse mémoire d'une méthode de classe
Comment obtenir l'adresse mémoire d'une méthode de classe
Iniciado por René BISSON ( Mediag, 24,feb. 2020 15:29 - 2 respuestas
Miembro registrado
23 mensajes
Publicado el 24,febrero 2020 - 15:29
Bonjour,

Dans le cadre d'un développement d'une interface, avec un logiciel externe, je dois définir un 'CallBack'.
Pour ce faire, lors de l'appel de la fonction SetCallBack de l'API du logiciel externe je dois fournir l'adresse mémoire de la procédure ou méthode 'Callback'.

Quand je passe l'adresse d'une procédure local à une fenêtre il n'y a pas de problème.
exemple
Procedure setAPICallbackMethod(i_nCallBackMethodAdd is system int)

wAPIRegister..DLLName = wc_sDLL_NAME
wAPIRegister..FunctionName = wc_sWCAP_REGISTER_RECEIVE_FN
wAPIRegister..CallingConvention = STDCALL
wAPIRegister..Parameter[1]..Type = apiSystemInt

wAPIRegister(i_nCallBackMethodAdd)


oAPI.setAPICallbackMethod(&MyCallBack)


j'aimerais passer une méthode de classe au lieu d'une procédure local à une fenêtre. Mais quand j'option une erreur de compilation. Erreur :L'opérateur & n'est autorisé que sur les variables.

Est-ce que quelqu'un sais comment faire ?

Merci
Miembro registrado
512 mensajes
Publicado el 24,febrero 2020 - 17:58
Bonjour René,

Il faut d'abord nous préciser le type de "callback" attendu pour le paramètre [1] de la fonction d'API déclarée avec wAPIRegister.

Est-ce qu'il 'agit (a) d'une simple procédure ou bien (b) d'une méthode associée à une instance de classe ?

Dans le cas (a), je vois deux solutions.
Si l'instance de classe n'est pas importante, alors vous devriez utiliser une méthode GLOBALE de classe, qui pourra être directement utilisée comme callback.
En revanche, si l'instance de classe est nécessaire pour la procédure "callback", alors vous devriez exploiter le concept de "closure" (ou clôture en français) qui permet de générer une sorte de procédure globale qui vient avec son propre contexte de variables, par exemple une référence à une instance de classe.

Vous aurez besoin de connaître le concept de procédure interne :
https://doc.pcsoft.fr/fr-FR/?1514075&name=Procedure_interne

Un blogueur a fait une série d'articles qui vous seront utiles (merci à lui) :
http://www.ytreza.org/fr/windev-ouverture-aux-closures

:-)
Miembro registrado
5 mensajes
Publicado el 19,julio 2020 - 10:56
Bonjour René,

JBO a bien répondu (et merci d'avoir cité mon article).

Dans votre exemple, vous attendez un pointeur de fonction sous forme d'entier. Je doute que l'on puisse convertir une méthode de classe de cette manière. Certains langages le permettent, mais je ne suis pas sûr que WinDev le fasse.

Plutôt que d'utiliser une procedure locale, vous pouvez essayer avec une procedure interne.

Exemple avec une procédure interne :

MyObject is cSomeThing dynamic = new cSomeThing()
oAPI.setAPICallbackMethod(&MyCallBack)

Internal Procedure MyCallBack(*)
MyObject.AnotherCallBack(MyParameters)
END


ATTENTION ! Il ne faut pas que MyObject soit libéré avant l'appel de la callback, sinon, gare au plantage !