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

我有两个插件(称为A和B)以DLL(不是包)的形式。 在应用程序中声明了一个GUID的接口,它加载DLL,称之为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边界询问接口是否有问题?

===============>>#1 票数:7 已采纳

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

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

===============>>#2 票数:6

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

  ask by rhody translate from so

未解决问题?本站智能推荐:

1回复

Delphi接口和DLL

我试图找出一种将对象从主应用程序传递到DLL(用于插件系统)的安全方法。 这个想法是在dll中使用主应用程序的TZConnection(从Zeos Lib访问数据库)。 我宁愿不使用运行时程序包,而DLL必须是要走的路(我不需要BPL每次都需要重新编译,也不知道如何使用COM)。
1回复

接口DLL表单应用崩溃

我的主机应用程序有问题,该应用程序加载DLL格式并连接某些功能和属性。 目的是加载一个dll,将名称显示为模块名称,设置与ADOTable组件的连接并使用数据显示表单。 一切正常。 但是关闭主机应用程序后,一个主机应用程序崩溃了,我得到了hostapp.exe停止运行的窗口。 我
1回复

如何检查接口对象是否实现了另一个接口?

我有以下接口声明: 给定实现IListener的对象的接口引用,如何检查它是否还实现IExtendedListener ? 我正在使用下面的代码,因为if Listener is IExtendedListener then ... ,则会发生编译时错误。
3回复

检索实现给定接口的对象列表

介绍 我正在我的应用程序中构建插件架构。 插件实现给定的接口IBasePlugin ,或从基接口继承的其他一些接口: 主机正在加载插件程序集,然后创建实现IBasePlugin接口的任何类的适当对象。 这是加载插件并实例化对象的类: 问题 目前,任何支持插件的
3回复

在非托管cpp dll中实现C#接口

我有一个具有附加功能的C#应用​​程序。 可以在运行时将实现特定接口的加载项/插件链接/加载到主C#应用程序。 现在我的问题是:如何开发实现C#接口的非托管cpp dll并在运行时将其加载到C#应用程序? 谢谢,卡比
1回复

基于DLL的应用程序框架,带有双向接口(Windows)

解决了 this不是问题,因为它无论如何都被隐式地转换为IFramework 。 我担心它可能与我的方法没有返回HRESULT ,或者我的IUnknown::QueryInterface粗短实现,但真正的问题只是一个编译器设置已经覆盖了我需要的常见调用约定的几个宏(也许我应该将它们包
6回复

添加插件支持:接口或基类继承?

我正在为我的.NET应用程序添加插件支持。 基类对我来说听起来很合理,所以人们可以继承它并覆盖某些调用,也可以保留默认功能或者可以使用一些内部帮助函数。 为什么我要选择接口而不是基础插件类来继承? 你能说出我应该选择哪种设计以及为什么?
3回复

将对象转换为基接口

我有一个问题,将对象转换为生成在另一个库中的其中一个基本接口。 这是它的代码: BaseSDK.dll CustomPlugin.Definition.dll: CustomPlugin.dll(引用BaseSDK.dll和CustomPlugin.Definition.
5回复

C#插件架构,接口在插件之间共享

我把我的问题分成了一个简短的版本,适用于手头很少的人。 精简版: 我需要一些具有提供者和消费者插件的系统架构。 提供商应实施interface IProvider,消费者应实施IConsumer。 执行的应用程序应该只知道IProvider和IConsumer。 消费者实现可以
1回复

以标准化的方式将对象传递给接口/抽象类

背景:我经常问自己以下问题,但我从来没有找到没有缺陷的答案,我认为这是模块化软件开发中的常见问题。 因此,我不太确定是否更适合使用programms.stackexchange.com-但这个问题完全集中在Java上,我想要一个Java解决方案: 示例:有一个文本编辑器可以在文本编辑器中