Delphi Interfaces and DLL's

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-11 06:26:21

问题


I'm trying to figure out a safe way of passing objects from a main app to a DLL (for a plugin system). The idea is to use the main app's TZConnection (database access from Zeos Lib) in the dll's.

I'd rather not use Runtime Packages, and DLL must be the way to go (I don't need BPL's need to recompile each time, and have no idea of how to use COM).

I've been told it's possible to do it with Interfaces.

I've never used them before, but been messing around with it, and managed to do it... But, I don't know if I did it right (as in, safe).

Here's my Interface unit.

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.

In IQueryResult, I'm passing a TZQuery. It works, but... Is it safe? Is there any other way to wrap it in the Interface?

Thank you Nuno Picado


回答1:


TZQuery is a class. Therefore it is not safe to pass one across the module boundary unless you use runtime packages. Use a class with DLLs and you actually have two separate types, one in each module.

You are correct that interfaces are safe for this but you need to restrict yourself to DLL interop safe types. That is simple types, records, pointers to arrays, interfaces, or combinations of these types.

You need to wrap TZQuery with an interface that exposes it's functionality.



来源:https://stackoverflow.com/questions/21540276/delphi-interfaces-and-dlls

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!