Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

klasa u DLL i povezivanje sa osnovnim programom

[es] :: Pascal / Delphi / Kylix :: klasa u DLL i povezivanje sa osnovnim programom

[ Pregleda: 523 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon klasa u DLL i povezivanje sa osnovnim programom08.12.2022. u 11:44 - pre 16 meseci
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?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: klasa u DLL i povezivanje sa osnovnim programom08.12.2022. u 16:02 - pre 16 meseci
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.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
31.223.145.*



+62 Profil

icon Re: klasa u DLL i povezivanje sa osnovnim programom13.12.2022. u 09:19 - pre 16 meseci
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 :) )



 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: klasa u DLL i povezivanje sa osnovnim programom

[ Pregleda: 523 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.