gpt4 book ai didi

delphi - 如何查明对象是否支持给定接口(interface)(两个 DLL 之间)

转载 作者:行者123 更新时间:2023-12-03 15:18:02 26 4
gpt4 key购买 nike

我刚刚开始更加熟悉界面的工作原理,所以如果这是一个微不足道的问题,请耐心等待。

我有两个 DLL(不是包)形式的插件(称为 A 和 B)。在加载 DLL 的应用程序中声明了一个具有 GUID 的接口(interface),称为 IMyInterface。两个插件都看到具有相同 GUID 的相同接口(interface)定义。插件B实际上实现了该接口(interface)。

插件 A 想查明插件 B 是否支持 IMyInterface 接口(interface)。我使用 obj.GetInterface (IMyInterface, IObj) 来找出这一点:

var IObj : IMyInterface;
obj : TObject;

obj := getPluginObjReference;

if obj.GetInterface(IMyInterface, IObj) then
showmessage ('Interface Supported');

如果我在插件 B 中调用这段代码,答案是肯定的,这符合预期。如果我在插件 A 中使用相同的代码(剪切和粘贴),相同的代码会声称插件 B 不支持该接口(interface)。当我跟踪 system.pas 中的 GetInterface 调用时,我发现 InterfaceEntry := GetInterfaceEntry(IID);返回 nil,因此找不到接口(interface)。

仅供引用,IMyInterface 如下所示:

IMyInterface = interface
['{277A3122-A3F2-4A14-AE56-C99230F31CE9}']
function getModel : AnsiString;
function getDescription : AnsiString;
end;

实现如下:

// Now the real class, this is private to this plugin
TModelAPI = class (TInterfacedObject, IMyInterface)
function getModel : AnsiString;
function getDescription : AnsiString;
end;

等等

我的问题:

正如预期的那样,插件 B 正确地声明支持 IMyInterface。为什么插件A无法发现插件B支持IMyInterface?跨 DLL 边界询问接口(interface)是否存在问题?

最佳答案

您无法可靠地跨 DLL 边界传递对象。相反,您应该跨越边界传递接口(interface)并使用 asSupports 来查询功能。接口(interface)旨在实现跨 DLL 边界的二进制兼容性,但对象则不然。

您可以轻松地将 IInterface 从一个 DLL 传递到另一个 DLL,然后对其进行查询。或者,如果您有一个所有插件对象都实现的通用接口(interface),您可以传递它。重要的是您始终传递接口(interface)而不传递对象。

关于delphi - 如何查明对象是否支持给定接口(interface)(两个 DLL 之间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466722/

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