2010-05-10 2 views
1

En Delphi, vous pouvez passer des références de classe pour comparer les types d'objets et les instancier. Pouvez-vous faire de même avec les références d'interface transmises à un serveur d'automatisation COM?Comment passer une référence de type interface/GUID à une méthode d'automatisation dans Delphi

Par exemple, vous pouvez définir une méthode prenant un paramètre GUID utilisant l'éditeur de bibliothèque de types:

function ChildNodesOfType(NodeType: TGUID): IMBNode; safecall; 

Dans cette fonction, je voudrais revenir types d'automatisation qui prennent en charge l'interface spécifiée par NodeType, par exemple

if Supports(SomeNode, NodeType) then 
     result := SomeNode; 

Mais les soutiens appellent est toujours un échec, j'ai essayé de passer dans les Guids définies dans la bibliothèque de type, mais aucun des différents types (Ixxx, Class_xxxx, IId_Ixxxx) semble fonctionner.

Répondre

4

Le SysUtils appareil est livré avec au moins cinq de Supports surcharges, et ils acceptent tous une valeur TGUID pour leurs deuxièmes paramètres.

Vous pouvez en effet passer des types d'interface en tant que paramètres, mais ce ne sont en réalité que des GUID. Autrement dit, lorsqu'une fonction attend un argument TGUID, vous pouvez lui transmettre l'identificateur de type d'interface, tel que IMBNode ou IUnknown. Pour que cela fonctionne, cependant, le type d'interface doit inclure un GUID dans sa déclaration, comme ceci:

type 
    IMBNode = interface 
    ['{GUID-goes-here}'] 
    // methods and properties 
    end; 

Lorsque le premier paramètre à Supports est une référence d'interface, la fonction appelle sa méthode QueryInterface. Si elle renvoie S_OK, alors Supports renvoie true; sinon, il renvoie false. Lorsque le premier paramètre est une référence d'objet, il appelle d'abord la méthode GetInterface de l'objet pour obtenir son interface IUnknown, et appelle Supports comme précédemment. Si cela ne fonctionne pas de cette façon, il revient à demander l'interface demandée directement à partir de GetInterface. Si vous avez implémenté QueryInterface correctement sur votre objet, ou si vous avez utilisé l'implémentation par défaut de TInterfacedObject, tout devrait fonctionner correctement. Si Supports ne retourne jamais vrai pour vous, alors vous devriez revoir certaines hypothèses. Êtes-vous sûr votre noeud prend vraiment en charge l'interface que vous demandez? Allez vous assurer que la déclaration de classe inclut cette interface. Assurez-vous que QueryInterface est implémenté correctement. Et assurez-vous que SomeNode fait réellement référence au nœud auquel vous vous attendez.

+0

Salut Rob, merci, bonne réponse. Il n'y avait aucune raison que cela ne fonctionne pas, car j'utilisais TInterfacedObject sans fioriture. Donc j'ai vérifié mes suppositions et l'échec était en effet le résultat d'un passage accidentel d'un objet à Supports qui n'a pas implémenté l'interface. –

Questions connexes