Pointer de function en VB.NET

Phantom1981 Messages postés 6 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 juillet 2007 - 2 juil. 2007 à 06:33
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 2 juil. 2007 à 21:01
Pour faire un appel à un API, j'ai besoin de l'addresse de celle-ci en mémoire. En VB6 il suffisait de faire addressof mafonction, mais en VB.NET, c'est la galère. Addressof donne un delegate (une classe).

J'ai trouvé un tour de passe-passe pour obtenir l'addresse d'une variable en utilisant le garbage collector (un remake de la fonction varptr de VB6 qui n'existe plus en .NET). Y'aurait-il pas un autre tour de passe-passe semblable pour avoir l'addrese de ma fonction.

Merci

4 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
2 juil. 2007 à 09:39
Salut,
Ce que tu cherche s'appelle un délégué (Delegate).
Tu dois avoir le type de fonction dont tu veux un pointeur (la signature).
Ensuite tu déclare le delegate de cette signature :

Delegate MyDelegate(Param1 as Integer, Param2 as String, Param3 as Object) as Integer

Ensuite dans la déclaration de ton api, tu indique que le paramètre devant prendre l'adresse de ta fonction est de type MyDelegate, puis lors de l'appel, tu fais
TonApi(..., New MyDelegate(AddressOf MyFunction))

<hr size="2" width="100%" />Julien.
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
2 juil. 2007 à 09:40
Oups j'ai oublié un mot, c'est
Delegate Function MyDelegate ...
Ou bien sur Sub si elle ne renvoie rien

<hr size="2" width="100%" />Julien.
Phantom1981 Messages postés 6 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 2 juillet 2007
2 juil. 2007 à 20:13
Merci

J'ai essayer ça, ça compile, mais ça semble pas marcher.

Ma fonction est:

Private Function NewProc(ByVal hwnd As IntPtr, ByVal uMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
        MsgBox("in")
        Return CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
End Function

Mon API est celui-là:

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As IntPtr) As IntPtr

que j'ai modifier pour (avec le MyDelegate):

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As MyDelegate) As IntPtr

Private Delegate Function MyDelegate(ByVal hwnd As IntPtr, ByVal uMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr

Mon appel à l'API était:

PrevProc = SetWindowLong(ControlHandle, GWL_WNDPROC, AddressOf NewProc) où le addressof marchait pas

que j'ai modifié pour ça:

PrevProc = SetWindowLong(ControlHandle, GWL_WNDPROC, New MyDelegate(AddressOf NewProc))

Bon en gros, ça devrait me faire un msgbox à chaque fois que l'objet que j'ai choisi de hooker reçoit un message, mais ça marche pas.

Quelqu'un saurait pourquoi?
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
2 juil. 2007 à 21:01
Après ton appel à l'api, regarde le dernier code d'erreur, et tu sauras le problème. Pour voir ca je crois que c'est GetLastWin32Error() dans le namespace marshal, je sais plus trop, recherche dans l'explorateur d'objets...

<hr width="100%" size="2" />Julien.
Rejoignez-nous