[ FranjoZG @ 16.03.2022. 09:37 ] @
Zanima me da li griješim i da li će se poslije pokazati da nije dobro rješenje...
Osnovni program: D2007
Dll: XE 10.1

- U Dll-u kreiram klasu
- u posebnom unit-u defniran interface koji stavljam u uses Dll-a i programa
- u unit-u CertifikatInterface:
Code:

unit CertifikatInterface;
interface
type
   ICertifikat=interface
      ['{D3B99678-7540-416E-87D8-FCABD7CB307A}']
      function Preview(IO: integer): integer;
      function SaveToPDF(IO: integer): integer;
      function Error: string;
      function VratiTestString: string;
      function HasError: boolean;
      function BrojStranica: integer;
   end;                       

implementation

end.


- U Dll-u imam export:
Code:


library DllCertifikatl;

uses CertifikatInterface;
...
type
   tCert=class(TInterfacedObject, ICertifikat)
      constructor Create;
      destructor Destroy; override;
   ...
   end;
 
   ...
   function CreateCertifikat: ICertifikat; stdcall; export;
   begin
      result := tCertifikat.Create;
   end;
   
   exports
     CreateCertifikat;


- u osnovnom programu (D2007) imam:

Code:

uses CertifikatInterface;
...
   TFormMain=class(TForm)
   ...
   public
      Certifikat: ICerifiakt
   end;
   ....

implementation

{$R *.dfm}

   function CreateCertifikat: ICertifikat; stdcall; external 'DllCertifikat.dll';

   procedure TFormMain.Button2Click(Sender: TObject);
   begin
      if not Assigned(Certifikat) then 
         Certifikat := CreateCertifikat;
   end;


Razlog zašto to radim je FastReport.
U Dll-u kreiram zasebnu konekciju na bazu, formu koja je "visible=false" na kojoj je dataconnection, fastreport, qry itd.
Nakon toga pristupam interface-u "Crtifikat" kao da je kreiran u osnovnom programu. Prosljeđujem pramatere, porperty-e, uzimam rezultate funkcija kao da je sve u osnovnom programu, ne brinem o tipu parametra. String ostaje string, ne koristim PChar itd.
Koliko je to ispravno ili će mi kasnije stvarati probleme?
Ugradio sam to u program koji je prilično velik i sve (koliko sam mogao vidjeti i testirati) radi ispravno.


[ savkic @ 17.03.2022. 05:52 ] @
Kao ideja deluje OK, COM tako radi.
Ja sad ne mogu da se setim da li su Delphi interfejsi nesto specificni pa implementacija/ponasanje zavisi od verzije kompajlera. Ako si testirao i radi, verujem da ce biti u redu.

Izmeni funkcije koje salju string, moze da bude problem jer ne dele memoriju, bolje je koristiti WideString, PChar ili OleVariant.