[ FranjoZG @ 08.12.2022. 11:44 ] @
Nedavno sam poćeo koristiti svoje DLL-ove.
Osnovni program je u D2007, a DLL-ove radim sa XE 10.1

Sada bi mi bilo zgodno cijelu jednu klasu prebaciti u DLL. Koliko je to pametno i kako pristupiti propery-ima?
Mislio sam kreirati Interface. Definirati ga u DLL-u i Osnovnom programu.

Pretpostavljam da property koji je string i dalje moram slati kao PCHar ili mogu:
Code:

NekiInterface.StringProperty := 'Neki moj string';


Molio bih savjet ako je netko do sada to radio. Da li se upoće upuštati u to? Ako je komplicirano, koristit ću txt file u kom ću slati DLL-u potrebne podatke.
Iz te klase u DLL-a ne vraćam podatke, koristim ga kreiranje izvješća i neke ispise. FastReport je bolji od QR-a, pogotovo za tekstove i poravnanja, a moji klijetni pate na "lijep izgled". Te poravnato lijevo, te pravnato desno, te malo gore, te malo dolje...

Evo što sam pronašao:

DLL:
Code:

library StringFunctions;

uses
  StringFunctions_IntfU; // use Interface-Deklaration

{$R *.res}

type
  TStringFunctions = class( TInterfacedObject, IStringFunctions )
  protected
    function CopyStr( const AStr : WideString; Index : Integer; Count : Integer ) : WideString;
  end;

  { TStringFunctions }

function TStringFunctions.CopyStr( const AStr : WideString; Index, Count : Integer ) : WideString;
begin
  Result := Copy( AStr, Index, Count );
end;

function GetStringFunctions : IStringFunctions; stdcall; export;
begin
  Result := TStringFunctions.Create;
end;

exports
  GetStringFunctions;

begin
end.


Main prog:
Code:

uses
  StringFunctions_IntfU;  // use Interface-Deklaration

// Static link to external function
function GetStringFunctions : IStringFunctions; stdcall; external 'StringFunctions.dll' name 'GetStringFunctions';

procedure TMainView.Button1Click( Sender : TObject );
begin
  Label1.Caption := GetStringFunctions.CopyStr( Edit1.Text, 1, 5 );
end;


Po ovome mogu slati u DLL direktno string (Edit1.Text)?
Nije mi jasna funkcija u DLL-u "GetStringFunctions". Ne kreira li ona svaki put kad se pozove s novim ili drugim parametrom ponovno objekt od TStringFunctions?
[ savkic @ 08.12.2022. 16:02 ] @
Mozes koristiti interfejse (samo obavezno nasledi od IUnknown), tako u osnovi pravis COM kompatibilan objekat.
Druga bitna stvar, zaboravi na string za public propertije, koristi WideString ili OleString.
[ Rapaic Rajko @ 13.12.2022. 09:19 ] @
Ako sam dobro shvatio, pitanje je - ima li curenja memorije prilikom ucestalog pozivanja funkcije GetStringFunctions?

Po nekoj logici, ne bi trebalo da bude, jer je koriscen interface (i onda tu radi reference counting); kad count padne na 0 (nula), poziva se destructor klase.

Pokusaj ovako, forsiran down counting:

Code:

uses
  StringFunctions_IntfU;  // use Interface-Deklaration

// Static link to external function
function GetStringFunctions : IStringFunctions; stdcall; external 'StringFunctions.dll' name 'GetStringFunctions';

procedure TMainView.Button1Click( Sender : TObject );
var
  aStringFunctions: IStringFunctions;
begin
  aStringFunctions := GetStringFunctions;
  Label1.Caption := aStringFunctions.CopyStr( Edit1.Text, 1, 5 );
  aStringFunctions := nil; // down counting (-1)
end;


Poslednja linija je mozda i nepotrebna, jer bi je ionako stack izvrsio prilikom izlaska iz metode (unistava se referenca na interface).
Da bi proverio da li ovo radi, napravi destructor klase TStringFunctions (u dll-u) i vidi da li se izvrsava/poziva. Najlakse je staviti neki ShowMessage ili slicno u destructor (posle rem-ovati, naravno :) )