在Delphi中,您可以传递类引用来比较对象的类型,并实例化它们。您是否可以将接口引用传递给COM自动化服务器?
例如,您可以使用类型库编辑器定义获取GUID参数的方法:
function ChildNodesOfType(NodeType: TGUID): IMBNode; safecall;
在这个函数中,我想返回支持NodeType指定的接口的自动化类型,例如
if Supports(SomeNode, NodeType) then
result := SomeNode;
但Supports调用总是失败,我尝试传入类型库中定义的Guids,但是没有任何不同的类型(Ixxx,Class_xxxx,IId_Ixxxx)似乎都有效。
答案 0 :(得分:4)
SysUtils 单元至少有五个Supports
重载,它们都接受第二个参数的TGUID
值。
您确实可以将接口类型作为参数传递,但它们实际上只是GUID。也就是说,当函数需要TGUID
参数时,您可以向其传递接口类型标识符,例如IMBNode
或IUnknown
。但是,要使其工作,接口类型需要在其声明中包含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
实际上引用了您期望的节点。