Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS DELPHI F.A.Q DELPHI TUTORIELS DELPHI LIVRES COMPOSANTS SOURCES DEFI TELECHARGEZ DELPHI TV

Construire une procédure pointant sur une méthode

Date de publication : 18/10/2007 , Date de mise à jour : 28/10/2007

Par Sébastien Doeraene (sjrd.developpez.com)
 

Beaucoup de procédures des API Windows, ou même de bibliothèques tierces, acceptent un paramètre de call-back dont le type est un pointeur de procédure. Cependant, on aimerait lui transmettre un pointeur de méthode, ne fut-ce que pour avoir des informations de contexte supplémentaires au sein du call-back.
Comme le tutoriel fr Combiner des procédures et des méthodes vous l'explique, il n'est possible de transmettre un pointeur de méthode à la place d'un pointeur de procédure que si la procédure en question est prévue pour : qu'elle possède un paramètre "inutile" en première place. Or dans le cas que nous examinons maintenant, nous n'avons pas la main sur la définition de la procédure de call-back, puisqu'elle appartient soit à Windows, soit à une bibliothèque tierce dont nous n'avons peut-être même pas le code source.
Toute la problématique réside donc en ceci : obtenir un pointeur sur une procédure qui, lorsqu'on l'appelle avec des arguments donnés, appelle elle-même une méthode dont la signature est identique, mais qui évidemment demande un paramètre implicite Self supplémentaire.
Vous êtes invités à donner vos commentaires sur le blog.
Un grand merci à Laurent Dardenne pour ses nombreuses remarques toujours aussi constructives, ainsi qu'à Pierre Rodriguez pour sa correction orthographique attentive.

Merci également à CapJack pour sa remarque pertinente quant au besoin d'un exemple d'utilisation des MakeProcOfXXXMethod.

Introduction
I. Public visé et pré-requis
II. La problématique
III. L'idée de base
IV. Que doit faire exactement CallBackProc ?
V. Les conventions d'appel : le passage des paramètres
VI. Comment utiliser les routines que nous allons développer ?
Conventions d'appel stdcall, pascal et safecall
VII. Convention d'appel stdcall
VII-A. Le code assembleur
VII-B. Code exécutable x86 correspondant
VII-C. Particularités des instructions JMP et CALL
VII-D. Générer dynamiquement le code
VIII. Convention d'appel pascal
Convention d'appel register
IX. Convention d'appel register
IX-A. Les difficultés
IX-B. Cas de base : il ne faut pas stocker ECX
IX-C. Ranger ECX au sommet da la pile
IX-D. Ranger ECX plus haut dans la pile
IX-E. Une première fonction MakeProcOfRegisterMethod
IX-F. Quand MoveStackCount devient trop grand
IX-G. Mettre ensemble les deux techniques
Convention d'appel cdecl
X. Convention d'appel cdecl
X-A. Les difficultés
X-B. Le code assembleur de base
X-C. Les routines de stockage et de récupération de l'adresse de retour
X-D. Que se passe-t-il en cas d'exception ?
X-E. Identifier les parties corrompues de la pile
X-F. Le code assembleur final
X-G. La fonction MakeProcOfCDeclMethod
X-H. La dernière touche contre les fuites mémoire
Conclusion
XI. Conclusion
XII. Liens
Annexes
XIII. Pour aller plus loin : se servir de ObjAuto
XIII-A. L'unité ObjAuto
XIII-B. Naviguer dans les RTTI étendues
XIII-C. Une unique routine avec CallingConvention
XIII-D. Compter le nombre de registres utilisés par la méthode
XIII-E. Déterminer le paramètre stocké par ECX dans la procédure
XIII-F. Le final
XIII-G. Code complet de GetAutoRegisterInfo


Tutoriels
Réaliser un plug-in comportant un composant
Construire une procédure pointant sur une méthode
Création de composants - en 4 parties
Refactoring avec Delphi 2007
Prise en main de Delphi 2005
Analyseurs syntaxiques - Leur fonctionnement par l'exemple
Créer un fichier d'aide HLP
Pourquoi un paramètre const change-t-il mystérieusement de valeur ?
Sources
SJRDUnits - Routines et classes diverses
SJRDComps - Quelques composants
Projet Sepi
Présentation
FAQ Sepi
Programmes
FunLabyrinthe - Jeu de labyrinthe très spécial et très fun
MultiAgenda - Agenda multi-répertoires
DecodeFormulaires - Décode les formulaires
Excel --> HTML - Convertisseur de tableaux Excel en HTML
AddressLinks - Lie les adresses Internet et e-mail d'un document HTML
Vipion - Tic Tac Toe sur 4x4 cases avec jeu de l'ordinateur
BigCalc - Calculatrice de haut niveau
Espace paroissial Astérion de Watermael-Boitsfort

Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2007 Sébastien Doeraene. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique Delphi : NoisetteProd et Pedro - Contacter par EMail :
Vos questions techniques : forum d'entraide Delphi - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.