如何找出一个对象是否支持给定的接口(在两个dll之间)



我刚刚开始熟悉接口是如何工作的,所以如果这是一个微不足道的问题,请原谅我。

我有两个插件(叫它们A和B)在dll(不是包)的形式。在加载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调用时。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边界的接口是否有问题?

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

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

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

最新更新