9
votes

Méthode Com Office dans Delphes

dans Delphi, comment puis-je trouver l'adresse d'une méthode COM? Je peux codifier les décalages xxx

mais je préférerais utiliser des noms symboliques. Le suivi ne fonctionne évidemment pas: xxx

merci!


3 commentaires

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.


4 Réponses :


3
votes

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.

Pourquoi essayez-vous de faire cela, BTW?


3 commentaires

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.



6
votes

Vous pouvez utiliser la directive vmtoffset 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 dans system.pas , par exemple: xxx

La première expression ajoute 0; Le second, 8.

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.

Tout ce que vous vraiment doit accrocher est QueryInterface . 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.


1 commentaires

Cela semble prometteur ... Je vais l'essayer plus tard aujourd'hui et poster les résultats. Merci!



2
votes

Votre code est faux, car une référence d'interface n'est pas un pointeur à une table de méthode d'interface, mais un pointeur au pointeur sur une table de méthode d'interface . C'est ainsi que les interfaces Delphes sont implémentées au niveau binaire. Il est difficile de dire plus et signalez-vous à l'erreur dans votre code, car vous n'avez pas donné d'exemple de code pouvant être compilé. Utilisez le code suivant pour convertir une référence d'interface en un pointeur de méthode correctement, l'idée a été prise à partir de La démonstration de Barry Kelly de la création d'un pointeur de méthode à partir d'une référence de méthode : xxx

Si vous préférez les noms symboliques de Methno, vous préférez les déclarer comme décalage constantes


3 commentaires

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/...



1
votes

Deux directives supplémentaires permettent au code de montage d'accéder dynamique et Méthodes virtuelles: vmtoffset et dmtindex.

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.

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.

docwiki.embarcadero.com

ici le code pour obtenir le pointeur de méthode nécessaire xxx


0 commentaires