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

如何在Delphi中将接口类型/GUID引用传递给自动化方法,delphi,com,automation,Delphi,Com,Automation,在Delphi中,您可以传递类引用来比较对象的类型,并实例化它们。对于传递给COM自动化服务器的接口引用,您也可以这样做吗 例如,可以使用类型库编辑器定义采用GUID参数的方法: function ChildNodesOfType(NodeType: TGUID): IMBNode; safecall; 在这个函数中,我想返回支持NodeType指定的接口的自动化类型,例如 if Supports(SomeNode, NodeType) then result := SomeNod

在Delphi中,您可以传递类引用来比较对象的类型,并实例化它们。对于传递给COM自动化服务器的接口引用,您也可以这样做吗

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

function ChildNodesOfType(NodeType: TGUID): IMBNode; safecall;
在这个函数中,我想返回支持NodeType指定的接口的自动化类型,例如

if Supports(SomeNode, NodeType) then
      result := SomeNode;
但是支持调用总是失败,我尝试传入类型库中定义的GUID,但不同类型的Ixxx、Class_xxxx、IId_Ixxxx似乎都不起作用。

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

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

type
  IMBNode = interface
    ['{GUID-goes-here}']
    // methods and properties
  end;
当支持的第一个参数是接口引用时,该函数调用其QueryInterface方法。如果返回S_OK,则支持返回true;否则,它将返回false。当第一个参数是对象引用时,它首先调用对象的GetInterface方法以获取其IUnknown接口,并像前面一样调用对该接口的支持。如果它不能以这种方式工作,那么它会退回到直接从GetInterface请求所请求的接口。如果已经在对象上正确实现了QueryInterface,或者使用了TInterfacedObject的默认实现,那么一切都应该正常工作

如果支持对您来说永远不会返回true,那么您应该重新考虑一些假设。您确定您的节点确实支持您请求的接口吗?确保类声明包含该接口。确保QueryInterface正确实现。并确保SomeNode实际引用了您期望的节点。

SysUtils单元至少有五个支持重载,并且它们都接受第二个参数的TGUID值

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

type
  IMBNode = interface
    ['{GUID-goes-here}']
    // methods and properties
  end;
当支持的第一个参数是接口引用时,该函数调用其QueryInterface方法。如果返回S_OK,则支持返回true;否则,它将返回false。当第一个参数是对象引用时,它首先调用对象的GetInterface方法以获取其IUnknown接口,并像前面一样调用对该接口的支持。如果它不能以这种方式工作,那么它会退回到直接从GetInterface请求所请求的接口。如果已经在对象上正确实现了QueryInterface,或者使用了TInterfacedObject的默认实现,那么一切都应该正常工作


如果支持对您来说永远不会返回true,那么您应该重新考虑一些假设。您确定您的节点确实支持您请求的接口吗?确保类声明包含该接口。确保QueryInterface正确实现。并确保SomeNode实际引用了您期望的节点。

嗨,Rob,谢谢,回答得很好。没有理由认为它不起作用,因为我使用的是没有任何装饰的TInterfacedObject。所以我检查了我的假设,失败确实是由于意外地将一个对象传递给没有实现接口的支持。嗨,Rob,谢谢,回答得很好。没有理由认为它不起作用,因为我使用的是没有任何装饰的TInterfacedObject。所以我检查了我的假设,失败确实是由于意外地将一个对象传递给没有实现接口的支持。