我正在尝试找出一种将对象从主应用程序传递到DLL(对于插件系统)的安全方法。 我们的想法是在dll中使用主应用程序的TZConnection(来自Zeos Lib的数据库访问)。
我宁愿不使用Runtime Packages,而且DLL必须是可行的方法(我不需要BPL每次都需要重新编译,也不知道如何使用COM)。
我被告知可以使用Interfaces来实现。
我之前从未使用它们,但一直在搞乱它,并设法做到了......但是,我不知道我是否做得对(如安全)。
这是我的界面单元。
unit PluginIntf;
interface
uses
ZConnection, ZDataSet;
type
IQueryResult = interface ['{743AB77E-7897-403E-A0D9-4D02748E565D}']
function GetRecordCount: Integer;
function GetDataSet: TZQuery;
end;
IPluginHost = interface ['{A5A416B4-437E-4A1E-B228-0F94D54840B0}']
function RunSql(const SQLString:WideString): IQueryResult;
end;
IPlugin = interface ['{8D9591C3-5949-4F0A-883E-6ABD02597846}']
function GetCaption: WideString;
end;
implementation
end.
在IQueryResult中,我正在传递一个TZQuery。它有效,但......安全吗? 有没有其他方法将它包装在界面中?
谢谢 Nuno Picado
答案 0 :(得分:2)
TZQuery
是一个班级。因此,除非使用运行时包,否则跨模块边界传递一个是不安全的。使用带有DLL的类,实际上有两个不同的类型,每个模块一个。
您说这是正确的接口是正确的,但您需要将自己限制为DLL互操作安全类型。这是简单的类型,记录,指向数组的指针,接口或这些类型的组合。
您需要使用一个公开其功能的接口来包装TZQuery
。