Phantom1981
Messages postés6Date d'inscriptionlundi 20 février 2006StatutMembreDernière intervention 2 juillet 2007
-
2 juil. 2007 à 06:33
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDerniè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.
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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))
Phantom1981
Messages postés6Date d'inscriptionlundi 20 février 2006StatutMembreDerniè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.
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...