Envoyé par
CapJack
j'avoue avoir été découragé avant la fin, surtout par manque de temps.
C'est l'annexe que tu as "skippée" ou tu t'es arreté encore avant ?
Envoyé par
CapJack
A vrai dire, j'ai un peu le sentiment de rater quelque chose, car enfin :
Tes deux "soit" ne sont pas "blanc et noir". Qu'entends-tu par "commune à tous les appels" vs "est susceptible de s'adresser à plusieurs instances séparées".
Envoyé par
CapJack
soit la procédure callback est commune à tous les appels, et alors une référence explicite à la méthode d'une instance fixe suffit,
Si j'ai bien compris la remarque, il est indiqué dans la section L'idée de base que justement :
Seulement voilà ! Nous ne pouvons pas connaître l'objet sur lequel appeler la méthode. Et à la rigueur, on pourrait même ne pas savoir la méthode à appeler !
Envoyé par
CapJack
soit la procédure
callback est susceptible de s'adresser à plusieurs instances séparées, mais dans ce cas l'instance concernée est forcément déterminable d'une façon ou d'une autre par bijection à partir des paramètres transmis (sinon, à moi, ça me pose un problème de logique, à moins qu'il y ait une unité oui-ja.pas qui m'ait échappé !
) ; une simple liste tenue à jour permet alors de choisir le bon objet, au pire en parcourant la liste (en utlisant la propriété Tag pour stocker la valeur en retour dépendante de l'instance, s'il n'est pas possible de simplement transmettre l'adresse de l'instance elle-même, je pense aux fonctions de l'Api de Windows).
C'est presque vrai pour les call-back des API qui envoient - parfois - un handle, qui permet de retrouver le bon objet. Mais même cela n'est pas toujours vrai. Imagine un call-back qui envoie un unique paramètre entier, qui n'a rien à voir avec une bijection vers les objets potentiels. Comment fais-tu pour retrouver le bon objet ?
Envoyé par
CapJack
D'ailleurs si tu pouvais nous expliquer - en termes simples - comment tu détermines la bonne instance à partir de paramètres dont la nature, la liste et le contenu sont parfaitement variables, je t'en serais reconnaissant.
Eh bien en fait je ne détermine pas la bonne instance à partir des paramètres. La bonne instance, on la passe à MakeProcOfXXXMethod via le champ Data du paramètre Method. Ensuite, la valeur de ce champ Data est encodée dans le code exécutable de la procédure qui est produite.
C'est par exemple le cas dans l'instruction PUSH CallBackObj de stdcall, sauf que CallBackObj est alors enregistré comme valeur immédiate (constante, dans le jargon ASM), et non comme une variable.
Dans le code de MakeProcOfStdCallMethod, c'est l'instruction
ObjAddress := Method.Data;
qui s'en charge. Note bien que ObjAddress est ici une partie du code exécutable produit - précédé du $68 qui signifie "PUSH la valeur immédiate sur 4 octets qui suit".
Si je n'ai pas répondu à ta question, il faut que tu me la reposes plus précisément, parce que je ne suis pas sûr de l'avoir bien comprises
Partager