AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Speicherfreigabe von Stringlisten in DLL

Ein Thema von ueding · begonnen am 17. Apr 2009 · letzter Beitrag vom 21. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2   
ueding

Registriert seit: 21. Aug 2005
30 Beiträge
 
Delphi 10.4 Sydney
 
#1

Speicherfreigabe von Stringlisten in DLL

  Alt 17. Apr 2009, 14:13
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 17. Apr 2009, 14:27
Hoi, du baust die ja gleich ein Automatisierungsobject.

Setze deine Variable und Stringlisten in die Klasse, und dann überschreib den Destructor.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
ueding

Registriert seit: 21. Aug 2005
30 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 17. Apr 2009, 14:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 17. Apr 2009, 14:47
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 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? Schau mal in der Delphi-Hilfe unter Destructor. Dies sind eigentlich Grundlagen Objektorientierung und ohne diese sollte man sich nicht an Automatisierungsobjekte wagen ...
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
ueding

Registriert seit: 21. Aug 2005
30 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 17. Apr 2009, 16:46
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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 20. Apr 2009, 08:03
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?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#7

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 20. Apr 2009, 08:48
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).
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ueding

Registriert seit: 21. Aug 2005
30 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 20. Apr 2009, 14:50
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#9

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 20. Apr 2009, 15:04
Inherited solltest du nicht weglassen ... wer weiß was in den "älteren" Konstruktoren wichtiges drin gemacht wird.


Wie wird denn die Instanz von TBarcode erzeugt?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ueding

Registriert seit: 21. Aug 2005
30 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Speicherfreigabe von Stringlisten in DLL

  Alt 20. Apr 2009, 19:28
Danke für Eure Hilfe

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

Gruß

Gregor
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
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