【发布时间】: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 给出了正确的答案,因为他给出了更全面的答案,但基本上两者都是正确的。