Pointeur sur fonction the return :)

Résolu
Fulgy Messages postés 85 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 5 octobre 2004 - 13 sept. 2004 à 15:56
Fulgy Messages postés 85 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 5 octobre 2004 - 13 sept. 2004 à 17:46
Rebonjour! J'ai posté tout à l'heure une question sur les pointeurs sur fonction en VB6 à laquelle je me suis moi même répondu pensant avoir trouvé la réponse sur l'aide de VB, mais je suis rebloqué :'( (et cette fois-ci j'ai bien chercher avant de vous soumettre ma question). Voilà où j'en suis:

J'ai trouvé la méthode pour récupérer l'adresse d'une fonction/procédure qui est représenté par un Long, grâce à l'utilisation de AddressOf et maintenant je cherche à me servir de cette adresse pour appeller ma fonction mais c'est là que je bloque! Petit extrait de l'aide VB:

L'opérateur AddressOf permet de passer l'adresse de la procédure à une fonction API de Windows dans une DLL, et non la valeur renvoyée par la procédure. La fonction API peut alors utiliser l'adresse pour appeller la procédure Basic. Ce processus est connu sous le nom de "rappel".(...)S'il est vrai que vous pouvez utiliser l'opérateur AddressOf pour passer des pointeurs de procédures aux procédures Basic, vous ne pouvez appeler une fonction avec un pointeur de ce type en Basic.

Moi ce que j'en ai compris c'est que on peut récupérer des "pointeurs sur fonctions" mais qu'ils sont inutilisables sauf par l'intermédiaire d'une API!! Moi qui ai commencé par le C, ça me trou le c..! Si c'est aussi mal fait, il doit bien exister une API qui permette de passer un "pointeur sur fonction" en argument plus les arguments de cette fonction pointée pour pouvoir l'exécuter??? Rassurez-moi s'il vous plaît!!

4 réponses

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
13 sept. 2004 à 17:12
lol excelent ;)

( 1 ) Pour la declaration de l'API la voici :

Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal Pointeur As Long, ByVal P1 As Long, ByVal P2 As Long, ByVal P3 As Long, ByVal P4 As Long) As Long


Pointeur = AddressOf TaFonction
P1 P2 P3 P4 sont les paramettres de TaFonction

( 2 ) Il faut adapter le code de ta fonction car comme tu peux le voir plus haut pour utiliser CallWindowProc il faut empiler 4 paramettres ni plus ni moins

donc ta fonction "DOIT" ressembler a ceci

Function/Sub MaFonction(ByVal P1 As Long,Byval P2 As Long,ByVal P3 As Long, ByVal P4 As Long) (As Long)


( 3 ) Les *.obj sont des "morceaux de code" que lon peut lier avec le projet vb. Cette technique est pas tres pratique mais voici qlqs essaies dans ce domaine :

Compilation VB + Obj

Addin pour lier VB+ Obj

Appeler du code ASM depuis vb

Appel depuis pointeur

Appel de CallWindowproc

Voilou...

@+

E.B.
3
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
13 sept. 2004 à 16:42
Exact ! inutilisable dans la syntaxe VB dite "classique".
le plus simple c'est CallWindowsProc a condition d'adapter
le code de la procedure pour accepter 5 paramettres de type long
(sinon autre possibilité avec *.Obj ou code ASM)

@+

E.B.
0
Fulgy Messages postés 85 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 5 octobre 2004
13 sept. 2004 à 16:53
Eh mais t'étais censé me rassurer E.B. !! :)
Tu sais où je pourrais trouver des infos sur cette fonction parce-que je l'ai pas sous l'aide de VB? Qu'est-ce que tu entends par adapté le code de la procédure? C'est quoi les *.obj? Quand est-ce qu'on mange? ... Ok! -->[ ]
Merci :)
0
Fulgy Messages postés 85 Date d'inscription mercredi 21 juillet 2004 Statut Membre Dernière intervention 5 octobre 2004
13 sept. 2004 à 17:46
Merci E.B. pour toutes ces infos, finalement je crois que je vais garder les pointeurs sur fonction pour le C uniquement :) ça va pas convenir pour l'utilisation que je voulais en faire, tant pis je vais me débrouiller autrement. Au fait ta ligne:
Pointeur = AddressOf TaFonction n'est pas correcte, faut faire une p'tite fonction (Wrapper) débile pour récupérer un "pointeur sur fonction" (je l'est mise sur le post Pointeur sur fonction). Encore merci et a+.
0
Rejoignez-nous