![]() |
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:
ich kann die Stringlisten in der function TBarcode.Get_SetFileName:
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. 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 |
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. |
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:
Danke |
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:
|
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? |
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? |
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:
Wenn nur eines übergeben werden soll, dann nimm zwei Konstruktoren.
constructor Create(AOwner: TBarcode);
Delphi-Quellcode:
Aber wozu übergibst du einen Owner (AOwner), wenn du ihn dann garnichts nutzt?
constructor Create(AOwner: TAutoObject); Overload;
constructor Create(AOwner: Ibarcode); Overload; |
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 |
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? |
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 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz