gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:35:53 24 4
gpt4 key购买 nike

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

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

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

在这个函数中,我想返回支持 NodeType 指定接口(interface)的自动化类型,例如
if Supports(SomeNode, NodeType) then
result := SomeNode;

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

最佳答案

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

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

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

当第一个参数为 Supports是一个接口(interface)引用,函数调用它的 QueryInterface方法。如果返回 S_OK ,然后 Supports返回真;否则,它返回 false。当第一个参数是对象引用时,首先调用对象的 GetInterface获取其 IUnknown的方法接口(interface),并调用 Supports像以前一样。如果它不能那样工作,那么它会退回到直接从 GetInterface 请求所请求的接口(interface)。 .如果你已经实现了 QueryInterface在您的对象上正确,或者如果您使用了 TInterfacedObject 中的默认实现,那么一切都应该正常工作。

如果 Supports永远不会为您返回 true,那么您应该重新审视一些假设。你确定你的节点真的支持你请求的接口(interface)吗?确保类声明包含该接口(interface)。确保 QueryInterface实现得当。并确保 SomeNode实际上是指您期望的节点。

关于delphi - 如何将接口(interface)类型/GUID 引用传递给 Delphi 中的自动化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2801846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com