如何将接口类型/ GUID引用传递给Delphi中的自动化方法

时间:2010-05-10 10:15:20

标签: delphi com automation

在Delphi中,您可以传递类引用来比较对象的类型,并实例化它们。您是否可以将接口引用传递给COM自动化服务器?

例如,您可以使用类型库编辑器定义获取GUID参数的方法:

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

在这个函数中,我想返回支持NodeType指定的接口的自动化类型,例如

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

但Supports调用总是失败,我尝试传入类型库中定义的Guids,但是没有任何不同的类型(Ixxx,Class_xxxx,IId_Ixxxx)似乎都有效。

1 个答案:

答案 0 :(得分:4)

SysUtils 单元至少有五个Supports重载,它们都接受第二个参数的TGUID值。

您确实可以将接口类型作为参数传递,但它们实际上只是GUID。也就是说,当函数需要TGUID参数时,您可以向其传递接口类型标识符,例如IMBNodeIUnknown。但是,要使其工作,接口类型需要在其声明中包含GUID,如下所示:

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

Supports的第一个参数是接口引用时,该函数调用其QueryInterface方法。如果它返回S_OK,则Supports返回true;否则,它返回false。当第一个参数是对象引用时,它首先调用对象的GetInterface方法以获取其IUnknown接口,并像之前一样调用Supports。如果它不起作用,那么它将直接从GetInterface请求所请求的接口。如果您已在对象上正确实施QueryInterface,或者您已使用TInterfacedObject中的默认实施,那么一切都应该正常。

如果Supports永远不会为您返回,那么您应该重新审视一些假设。您确定您的节点是否真的支持您要求的界面?确保类声明包含该接口。确保正确实施QueryInterface。并确保SomeNode实际上引用了您期望的节点。