代码之家  ›  专栏  ›  技术社区  ›  Alan Clark

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

  •  1
  • Alan Clark  · 技术社区  · 14 年前

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

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

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

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

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

    但是支持调用总是失败的,我试着传入类型库中定义的guid,但是没有一个不同的类型(ixxx,class_xxx,iid_ixxx)似乎可以工作。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Rob Kennedy    14 年前

    这个 系统实用程序 单元至少有五个重载 Supports ,他们都接受 TGUID 第二个参数的值。

    您确实可以将接口类型作为参数传递,但它们实际上只是guid。也就是说,当一个函数需要 塔吉德 参数,可以将接口类型标识符传递给它,例如 IMBNode IUnknown . 但是,要使其工作,接口类型需要在其声明中包含一个guid,如下所示:

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

    当第一个参数 支架 是一个接口引用,函数调用 QueryInterface 方法。如果它回来了 S_OK 然后 支架 返回true;否则返回false。当第一个参数是对象引用时,它首先调用对象的 GetInterface 获取ITS的方法 不知道 接口和调用 支架 就像以前一样。如果它不能以这种方式工作,那么它就返回到直接从 获取接口 . 如果你已经实现了 查询接口 在您的对象上正确,或者如果您使用了 TInterfacedObject ,那么一切都应该正常。

    如果 支架 永远不要为你返回真,那么你应该重新考虑一些假设。你是吗 当然 你的节点真的支持你请求的接口?确保类声明包含该接口。确保 查询接口 执行正确。确保 SomeNode 实际上是指您希望它指向的节点。