Comment lancer une interface vers un objet en Delphi
En delphi 2009, j'ai une référence à un IInterface
qui je veux fonte de la sous - TObject
À l'aide de TObject(IInterface)
de toute évidence ne fonctionne pas en Delphi 2009 (il est censé fonctionner en Delphi 2010)
Mes recherches me conduisent à une fonction qui devrait faire l'affairemais il ne fonctionne pas pour moi, je reçois AV quand j'essaie d'appeler des méthodes sur l'objet retourné.
je ne peux pas vraiment modifier les Classes et je sais que cela casse la POO
source d'informationauteur Yona
Vous devez vous connecter pour publier un commentaire.
Au lieu de compter sur Delphi interne de l'objet de mise en page que vous pourriez aussi avoir vos objets de mettre en œuvre une autre interface qui serait simplement retourner l'objet. Bien entendu, cela ne fonctionne que si vous avez accès au code source des objets, pour commencer, mais vous ne devriez probablement pas à même d'utiliser ces hacks si vous n'avez pas accès au code source des objets.
Vous avez raison. Début avec Delphi 2010, vous êtes en mesure d'utiliser l'opérateur, par exemple via
aObject := aInterface as TObject
ou mêmeaObject := TObject(aInterface)
.Ce
as
opérateur spécial caché interface GUID (ObjCastGUID
) pour récupérer l'objet de l'instance, l'appel d'une version améliorée deTObject.GetInterface
qui n'existe pas avant Delphi 2010. Voir le code source deSystem.pas
unité de voir comment il fonctionne.J'ai publié un code de travail pour Delphi 6 jusqu'à XE2 y compris Delphi 2009.
Voir http://blog.synopse.info/post/2012/06/13/Retrieve-the-object-instance-from-an-interface
En bref: vous ne devriez pas ou ajouter une interface avec une méthode qui retourne le pointeur pour vous. Tout le reste est hackery.
Noter qu'une interface "instance" peut être mis en œuvre dans une autre langue (ils sont COM compatible) et /ou peut-être un stub pour quelque chose en dehors du processus etc etc.
Dans l'ensemble: une interface instance s'engage uniquement à l'interface et rien d'autre, certainement pas à la mise en œuvre de Delphi TObject instance
Il est une bonne alternative si vous connaissez la mise en œuvre de l'objet est une
TComponent
descendant.Vous pouvez utiliser le
IInterfaceComponentReference
de l'interface, qui est définie dansClasses
unité:Et puis il est déclaré dans
TComponent
(et mis en œuvre pour revenirself
):Donc, si vous savoir la mise en œuvre de l'objet est une
TComponent
ensuite, vous pouvez faire ceci:Hallvard du hack est très spécifique à la façon dont le compilateur Delphi génère du code. Qui a été remarquablement stable dans le passé, mais il semble comme ils ont changé quelque chose d'important dans Delphi 2009. Je n'ai que 2007 est installé ici, et en ce que, Hallvard code fonctionne très bien.
Ne GetImplementingObject retourner NIL?
Si oui, alors si vous déboguez et définir un point de rupture sur l'affaire à l'instruction dans la GetImplementingObject routine, quelle est la valeur de QueryInterfaceThunk.AddInstruction évaluer dans le débogueur?