dans Delphi, comment puis-je trouver l'adresse d'une méthode COM?
Je peux codifier les décalages mais je préférerais utiliser des noms symboliques. Le suivi ne fonctionne évidemment pas: p> merci! P> p> p>
4 Réponses :
Je ne pense pas que Delphi soutient cela. Code papier Les décalages sont probablement la seule chose qui fonctionnera, car le compilateur ne compose pas les méthodes d'interface en tant que symboles dont la valeur peut être affectée à un pointeur de fonction, la manière dont les méthodes d'objet ou les fonctions autonomes peuvent. P>
Pourquoi essayez-vous de faire cela, BTW? P>
J'intercepte des appels vers un objet COM externe à l'aide de Win32Hook.PAS - Juste une fonction de journalisation de mon OutlookSpy ( Dimastr.com / une surprise )
BTW, Delphi Compiler connaît évidemment la méthode décalage, j'essaie simplement de trouver un moyen de faire la même chose au lieu d'utiliser des compensations codées.
Oui, le compilateur le sait, mais autant que je sache, il n'y a aucun moyen de l'obtenir directement.
Vous pouvez utiliser la directive La première expression ajoute 0; Le second, 8. P> Vous ne pouvez pas paramétrer ces expressions, cependant. Ce sont des constantes de temps complets, vous ne pouvez donc pas choisir la méthode que vous souhaitez au moment de l'exécution. Vous devez avoir tous les noms de méthodes possibles représentés à l'avance. P> Tout ce que vous vraiment em> doit accrocher est vmtoffset code> assembler pour obtenir le décalage d'octet d'une méthode d'interface par rapport au début de la table de méthode de l'interface. Jetez un coup d'œil à la mise en œuvre de
_intfast code> dans system.pas em>, par exemple:
QueryInterface code>. Une fois que vous aurez cela, vous pouvez retourner quel que soit votre objet de proxy que vous souhaitez intercepter des appels vers toutes les autres méthodes. P> P>
Cela semble prometteur ... Je vais l'essayer plus tard aujourd'hui et poster les résultats. Merci!
Votre code est faux, car une référence d'interface n'est pas un pointeur à une table de méthode d'interface, mais Si vous préférez les noms symboliques de Methno, vous préférez les déclarer comme décalage constantes p> p>
Non, une variable d'interface dans Delphi est un pointeur sur une table V.
Non, Dmitry, Serg a raison. Une variable d'interface ne peut pas simplement être un pointeur sur un circuit bancaire. Toutes les instances de la classe partagent une table équipée unique, comme des classes non interfaces. Considérez C ++, dans lequel il n'y a pas de différence entre les interfaces et les classes ordinaires. Un pointeur d'objet n'est pas simplement un pointeur à fourre-vtable, donc un pointeur d'interface.
@ROB Kennedy: Merci, la question m'a obligé à écrire un article de blog sur les interfaces Delphes: Sergworks.WordPress.com/2010/07/06/...
Deux directives supplémentaires permettent au code de montage d'accéder dynamique et Méthodes virtuelles: vmtoffset et dmtindex. P>
vmtoffset récupère le décalage en octets du pointeur de la méthode virtuelle Entrée de table de l'argument de la méthode virtuelle depuis le début de la Table de méthode virtuelle (VMT). Cette directive a besoin d'une entité spécifiée Nom de la classe avec un nom de méthode en tant que paramètre (par exemple, Texample.VirtualMethod), ou un nom d'interface et une méthode d'interface Nom. P>
dmtindex récupère l'index de la table de la méthode dynamique du passage méthode dynamique. Cette directive a également besoin d'un nom de classe entièrement spécifié avec un nom de méthode en tant que paramètre, par exemple, Texample.dynamicmethod. Pour appeler la méthode dynamique, appelez Système. @ CalldynAirt avec le registre (e) SI contenant la valeur obtenu de DMTIdex. P>
ici le code pour obtenir le pointeur de méthode nécessaire p>
xxx pré> blockQuote>
Delphi enlève beaucoup de tous les détails de Gory Com, je pense que vous voulez faire beaucoup trop vous-même. Qu'essayez-vous d'atteindre? Faire votre propre serveur COM ou en utilisant un existant?
Voulez-vous que le décalage numérique de la méthode dans l'interface (par exemple, iunknown.QuéryRerface est 0), l'adresse de la méthode de la classe qui implémente cette méthode d'interface (par exemple, @ TiterfaCedObject.QueryRerface) ou l'adresse du talon) ou l'adresse du talon Code généré pour relier un appel d'interface à la méthode d'objet correspondante? Ce dernier est stocké dans la table d'interface de la classe.
@Le_fox: Ni: Je n'ai pas intercepté d'appels vers un objet COM externe à l'aide de Win32Hook.PAS. @Rob Kennedy: Il n'y a pas de classe TinterfaCedObject - Je n'ai qu'une interface implémentée par une DLL externe.