【问题标题】:How to pass interface type/GUID reference to an automation method in Delphi如何将接口类型/GUID 引用传递给 Delphi 中的自动化方法
【发布时间】:2011-02-17 14:43:42
【问题描述】:

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

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

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

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

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

但 Supports 调用总是失败,我尝试传入类型库中定义的 Guid,但不同类型(Ixxx、Class_xxxx、IId_Ixxxx)似乎都不起作用。

【问题讨论】:

    标签: delphi com automation


    【解决方案1】:

    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 永远不会为您返回 true,那么您应该重新考虑一些假设。你确定你的节点真的支持你请求的接口吗?确保类声明包含该接口。确保QueryInterface 正确实施。并确保 SomeNode 实际上是指您期望的节点。

    【讨论】:

    • 嗨,Rob,谢谢,很好的回答。没有理由它不应该工作,因为我使用的 TInterfacedObject 没有多余的装饰。所以我检查了我的假设,失败确实是意外将对象传递给未实现接口的支持的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多