【问题标题】:How to find out if an object supports a given interface (between two DLLs)如何确定对象是否支持给定接口(在两个 DLL 之间)
【发布时间】:2011-12-11 19:21:27
【问题描述】:

我刚刚开始更熟悉接口的工作原理,如果这是一个微不足道的问题,请多多包涵。

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

插件 A 想知道插件 B 是否支持接口 IMyInterface。我使用 obj.GetInterface (IMyInterface, IObj) 来找出答案:

var IObj : IMyInterface;
    obj : TObject;

obj := getPluginObjReference;

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

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

作为参考,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 边界询问接口是否存在问题?

【问题讨论】:

  • 我很高兴地报告,ain 和 Heffernan 给出的答案提供了解决问题的必要信息。我停止传递对象,而是在插件之间传递 IInterface,然后我使用 support 方法来找出实际支持的接口,这很有效。我现在可以将插件归类为他们据报道可以做的事情。非常感谢您的帮助。 Heffernan 给出了正确的答案,因为他给出了更全面的答案,但基本上两者都是正确的。

标签: delphi plugins interface


【解决方案1】:

您无法可靠地跨 DLL 边界传递对象。相反,您应该跨边界传递接口并使用asSupports 来查询功能。接口是为跨 DLL 边界的二进制兼容性而设计的,但对象不是。

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

【讨论】:

  • 保持“100% 接口 API”不仅可以帮助您的 DLL 与 Delphi 一起工作,而无需编译两者以使用运行时包,它还可以在各种 Delphi 版本之间工作,甚至在用 Delphi 编写的 DLL 和不是用delphi编写的应用程序。简而言之,接口 (COM) 的存在是因为需要编写一个规范(应用程序二进制接口),该规范不会随着编译器的发布或语言之间的不同而改变。
【解决方案2】:

你真的应该只使用接口,即getPluginObjReference 应该返回所有插件支持的最低通用接口,然后你使用Supports() 函数来测试特定插件支持的接口(插件版本)。

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 2011-02-07
    • 2018-01-31
    • 2013-10-14
    • 2022-12-04
    • 2013-04-09
    • 2013-01-19
    相关资源
    最近更新 更多