Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherfreigabe von Stringlisten in DLL (https://www.delphipraxis.net/132687-speicherfreigabe-von-stringlisten-dll.html)

ueding 17. Apr 2009 14:13


Speicherfreigabe von Stringlisten in DLL
 
Hallo zusammen

Ich beschäftige mich gerade mit DLL und habe ein kleines Problem.
erst einmal ein Auszug vom Code

Delphi-Quellcode:
unit U_Barcode;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj, ActiveX, UE_BC_TLB, StdVcl, SysUtils;

type
  TBarcode = class(TAutoObject, IBarcode)
  protected
    function Get_SetFileName: OleVariant; safecall;
    procedure Set_SetFileName(Value: OleVariant); safecall;
    function Get_GetBcCode: OleVariant; safecall;
    procedure Set_GetBcCode(Value: OleVariant); safecall;

  end;

implementation

uses ComServ, ShlObj,classes,IncodeLib;
var
ErrorCode      : integer;
strParse       : TStringList;
strRow         : TStringlist;


procedure TBarcode.Set_SetFileName(Value: OleVariant);

begin


strParse := TStringList.Create;
strRow  := TStringList.Create;

//jetzt füllen der Stringlist


end;

 //--------------------------------------------------------------------------------


function TBarcode.Get_GetBcCode: OleVariant;
begin
result := barcode;

end;



initialization
  TAutoObjectFactory.Create(ComServer, TBarcode, Class_Barcode,
    ciMultiInstance, tmApartment);

end.
ich kann die Stringlisten in der function TBarcode.Get_SetFileName:
nicht freigeben da ich den Inhalt später noch benötige.
Gibt es eine Möglichkeit den Speicher bei "ONDESTROY" freizugeben,
oder wie kann Ich den Speicher beim beenden der DLL freigeben ?


Danke schon mal für Eure Hilfe


Gregor

sirius 17. Apr 2009 14:27

Re: Speicherfreigabe von Stringlisten in DLL
 
Hoi, du baust die ja gleich ein Automatisierungsobject.

Setze deine Variable und Stringlisten in die Klasse, und dann überschreib den Destructor.

ueding 17. Apr 2009 14:38

Re: Speicherfreigabe von Stringlisten in DLL
 
Die Funktionen des Automatisierungsobjectes können von VBScript aufgerufen werden.
Ich bekomme ja nicht mit wenn das VBScript beendet wird.
leider verstehe ich deine Anwort nicht so richtig.
Zitat:

Setze deine Variable und Stringlisten in die Klasse, und dann überschreib den Destructor.
könntest du mir dies bitte etwas ausführlicher beschreiben.
Danke

Bernhard Geyer 17. Apr 2009 14:47

Re: Speicherfreigabe von Stringlisten in DLL
 
Iiii, Globale Variablen. Ich hoffe du hast ein passentes Appartmentmodell das jede erzeugte Instanz des Interfaces einen eigenen Prozess startet sonst kracht es fürchterlich!

Zitat:

Zitat von ueding
Zitat:

Setze deine Variable und Stringlisten in die Klasse, und dann überschreib den Destructor.
könntest du mir dies bitte etwas ausführlicher beschreiben.

Du weißt nicht was der Destruktor einer Klasse ist? :shock: Schau mal in der Delphi-Hilfe unter Destructor. Dies sind eigentlich Grundlagen Objektorientierung und ohne diese sollte man sich nicht an Automatisierungsobjekte wagen ...

ueding 17. Apr 2009 16:46

Re: Speicherfreigabe von Stringlisten in DLL
 
Habe jetzt einen Constructor eingebaut
funktioniert leider nicht,
hier der Code


Delphi-Quellcode:
unit U_Barcode;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj, ActiveX, UE_BC_TLB, StdVcl, SysUtils;

type
  TBarcode = class(TAutoObject, IBarcode)
  protected
    function Get_SetFileName: OleVariant; safecall;
    procedure Set_SetFileName(Value: OleVariant); safecall;
    function Get_GetBcCode: OleVariant; safecall;
    procedure Set_GetBcCode(Value: OleVariant); safecall;
   
   public
    constructor Create(AOwner:TAutoObject, Ibarcode);// hier ist das Problem
    destructor Destroy; override;                   // ich kann nicht "TAutoObject, Ibarcode " zusammen angeben

  end;

implementation

uses ComServ, ShlObj,classes,IncodeLib;
var
ErrorCode      : integer;
strParse       : TStringList;
strRow         : TStringlist;


constructor Tbarcode.create(AOwner : Ibarcode);   // hier ist das zweite Problem

begin
inherited Create();
strParse       := TStringList.Create;
strRow         := TStringlist.Create;
end;


destructor tbarcode.destroy;

begin
 strParse.free;
 strrow.Free;
end

wenn ich nur Ibarcode oder TAutoObject angebe wird der Constructor nicht durlaufen aber der Destructor
wo mache ich den Fehler?

sirius 20. Apr 2009 08:03

Re: Speicherfreigabe von Stringlisten in DLL
 
Bei einem Automatisierungsobjekt (vom Delphi-Wizard erstellt) darfst/solltest du den Constructor nicht überschreiben. Überschreibe zum initialisieren die Methode "initialize".

Edit: Wie kommst du eigentlich auf diese Parameter bei Create?

himitsu 20. Apr 2009 08:48

Re: Speicherfreigabe von Stringlisten in DLL
 
Du kannst immer nur einen Typen als Parameter angeben!

Wenn beides zusammen in einem Objekt übergeben werden soll, dann kannst du einen "Kombinationstypen" angeben (TBarcode enthält ja beides).
Delphi-Quellcode:
constructor Create(AOwner: TBarcode);
Wenn nur eines übergeben werden soll, dann nimm zwei Konstruktoren.
Delphi-Quellcode:
constructor Create(AOwner: TAutoObject); Overload;
constructor Create(AOwner: Ibarcode); Overload;
Aber wozu übergibst du einen Owner (AOwner), wenn du ihn dann garnichts nutzt?

ueding 20. Apr 2009 14:50

Re: Speicherfreigabe von Stringlisten in DLL
 
Hallo
danke erst einmal
habe jetzt den Constructor und destructor wie nachstehend eingebaut

Delphi-Quellcode:
type
  TBarcode = class(TAutoObject, IBarcode)
  protected

    function Get_SetFileName: OleVariant; safecall;
    procedure Set_SetFileName(Value: OleVariant); safecall;
    function Get_GetBcCode: OleVariant; safecall;
    procedure Set_GetBcCode(Value: OleVariant); safecall;

   private

   public
    constructor Create;

    destructor Destroy; override;


  end;

.
.
implementation
.
.
constructor Tbarcode.Create;
begin
//inherited Create();

strParse := TStringList.Create;
strRow  := TStringList.Create;

end;


destructor TBarcode.destroy();
begin

 strParse.free;
 strrow.Free;
end;

der constructor wird nicht durchlaufen
aber der destructor wird durchlaufen.
Wenn ich inherited Create() hinzufüge ändert sich leider auch nichts.

Gruß Gregor

himitsu 20. Apr 2009 15:04

Re: Speicherfreigabe von Stringlisten in DLL
 
Inherited solltest du nicht weglassen ... wer weiß was in den "älteren" Konstruktoren wichtiges drin gemacht wird.


Wie wird denn die Instanz von TBarcode erzeugt?

ueding 20. Apr 2009 19:28

Re: Speicherfreigabe von Stringlisten in DLL
 
Danke für Eure Hilfe

rufe jetzt Constructor bei der Initialisierung der DLL auf.
Funktioniert.

Gruß

Gregor


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz