Intercepter des appels de methode (surcharge de vtable)

Soyez le premier à donner votre avis sur cette source.

Vue 7 527 fois - Téléchargée 633 fois

Description

Bonjour,

de nouveau un nom barbare, de nouveau une mini source !

pour un de mes projets, j'avais besoin d'intercepter les modifications du titre de ma Form.
reflex subclassin, j'ai voulu intercepter WM_SETTEXT...

ca fonctionne ! si on modifie le caption via SetWindowText (ou bien évidemment via SendMessage WM_SETTEXT) ^^

seul soucis, lorsque l'on modifie le caption via Form1.Caption, VB veut optimiser le traitement, et s'affranchit du traitement classique...
en effet, il appelle directement l'API DrawCaption, sans prévenir personne.

je ne vais pas vous expliquer COM, msdn et je ne sais combien de livres, sites webs etc seront plus précis que je ne pourrais l'etre ^^
mais en gros, chaque objet COM (les objets vus dans VB6) possèdent un tableau. Ce tableau contient l'adresse de toutes les fonctions a appeler pour telle ou telle propriété ou méthode.

J'ai simplement eu a trouver quel case de mon tableau contenait le pointeur utiliser lors d'un Property Let Caption, et de remplacer par l'adresse d'une fonction perso...

Source / Exemple :


Dim pVTable As Long
    '# On récupère le pointeur vers la VTable
    CopyMemory pVTable, ByVal ObjPtr(Form1), 4
    '# Le property Let Caption est la 21ème fonction
    '# On écrase donc cet élément de la VTable par l'adresse de notre fonction perso.
    CopyMemory ByVal (pVTable + 21 * 4), ProcPtr(AddressOf OverrideCaption), 4

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

RAFAAJ2000
Messages postés
16
Date d'inscription
samedi 27 mars 2010
Statut
Membre
Dernière intervention
30 décembre 2012
-
Merci de votre reponse.
En fait, j'ai reussi a faire ca avec excel mais je voudrais savoir comment appeller la Method originale apres l'interception. Est ce que vous savez comment le faire ?
Renfield
Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
56 -
pas le même espace mémoire... dangereux de jouer à ça avec une appli tierce
RAFAAJ2000
Messages postés
16
Date d'inscription
samedi 27 mars 2010
Statut
Membre
Dernière intervention
30 décembre 2012
-
J'ai essayé le code pour changer la Caption de l'application Excel lui mais ca ne marche pas.

J'ai passé le nombre 72 correspondant à la Propriéte Caption d'Excel que j'ai cherché dans le OLEViewer mais ca marche pas.

La function "OverrideCaption" ne semble pas s'executer.

Peut etre que je me suis trompé de numero de propriété .

Y a t-il quelqu'un qui puisse m'aider . Merci bcp.
Renfield
Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
56 -
Pour les besoins que j'en ais, j'utilise pour surcharger :


Public Declare Function SetWindowTextW Lib "user32.dll" (ByVal hWnd As Long, ByVal lpString As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Public Function OverrideCaption(ByVal voObjPtr As Long, ByVal vsCaption As Long) As Long
Dim oForm As Form
'# On récupère un objet a partir du pointeur This (voir doc sur COM...)
CopyMemory oForm, voObjPtr, 4
'# On met a jour le caption.... via WM_SETTEXT
SetWindowTextW oForm.hWnd, vsCaption
'# On libère notre objet
CopyMemory oForm, 0&, 4
End Function


ainsi, visuellement, aucun changement notable... mais WM_SETTEXT est envoyé, désormais.
Renfield
Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
56 -
certes...
pas utile dans mon cas, mais pourrait être utile...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.