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.
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;
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;
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.