Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何确定对象是否支持给定接口(在两个DLL之间)_Delphi_Plugins_Interface - Fatal编程技术网

Delphi 如何确定对象是否支持给定接口(在两个DLL之间)

Delphi 如何确定对象是否支持给定接口(在两个DLL之间),delphi,plugins,interface,Delphi,Plugins,Interface,我刚刚开始更加熟悉接口是如何工作的,如果这是一个微不足道的问题,请耐心等待 我有两个DLL形式的插件(称为A和B)(不是包)。有一个在加载DLL的应用程序中声明了GUID的接口,称之为IMyInterface。两个插件都使用相同的GUID查看相同的接口定义。插件B实际上实现了接口 插件A想知道插件B是否支持接口IMyInterface。我使用obj.GetInterface(IMyInterface,IObj)来发现: var IObj : IMyInterface; obj : TOb

我刚刚开始更加熟悉接口是如何工作的,如果这是一个微不足道的问题,请耐心等待

我有两个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;
实现如下所示:

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边界传递对象。相反,您应该跨边界传递接口,并使用
作为
支持来查询功能。接口是为跨DLL边界的二进制兼容性而设计的,但对象不是


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

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

我很高兴地报告,ain和Heffernan给出的答案为解决该问题提供了必要的信息。我停止传递对象,而是在插件之间传递接口,然后我使用supports方法找出实际支持哪些接口,这是可行的。我现在可以将插件分类为它们所能做的事情。非常感谢你的帮助。Heffernan给出了正确的答案,因为他给出了更全面的答案,但基本上两者都是正确的。保持“100%接口API”不仅有助于您的DLL使用Delphi,而无需编译两者以使用运行时包,还可以在各种Delphi版本之间工作,甚至在用Delphi编写的DLL和非用Delphi编写的应用程序之间。简言之,接口(COM)的存在是因为需要编写一个规范(应用程序二进制接口),该规范在不同版本的编译器之间或不同语言之间不会发生变化。