![]() |
FreeAndNil Problem
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
wir verwenden in unserer Firma die Labelling Software Codesoft. Codesoft bietet eine Typenbibliothek (ActiveX) an die man sich in Delphi integrieren kann (als Komponente). Hierzu hat vor einiger Zeit ein Kollege (der mittlerweile die Firma verlassen hat) noch zusätzlich eine Unit Programmiert über die man auf die Codesoft Funktionen zugreifen kann. Gestern habe ich auf meinem Rechner eine neue Version von Codesoft installiert. Alles funktioniert wunderbar bis auf das Beenden meines Programmes. Beim Start meines Programmes wird Codesoft wie folgt mitgestartet:
Delphi-Quellcode:
Beim schließen meines Programmes wird Codesoft wie folgt beendet:
//Create Codesoft Proxy
Try Codesoft := TCodesoftProxy.create(sDefaultFieldList, sDefaultFieldDSC , sDefaultBMP); Bitmap := TPicture.Create; Except On E:Exception Do Begin MessageDlg(E.Message, mtError, [mbOK], 0); End; End; //Initialize Codesoft Try Codesoft.initialize; Except On E:Exception Do Begin MessageDlg(E.Message, mtError, [mbOK], 0); End; End; End;
Delphi-Quellcode:
Im angehängten Bild seht ihr den Fehler den ich beim Schließen meines Programmes erhalte...
//Free Codesoft
If Codesoft <> nil Then Begin Try //Codesoft.Free; FreeAndNil(Codesoft); Except fnCloseProgram('Lppa.exe'); MessageDlg('Could not release Codesoft! Check your TaskManager!!!', mtError, [mbOK], 0); End; End; Das kuriose ist, ich habe ein Test Tool das auf die selbe Art & Weise Codesoft startet und beendet, hier erhalte ich diesen Fehler nicht ! Anbei der Code... Codesoft starten:
Delphi-Quellcode:
Codesoft schließen:
try
codesoftProxy := TcodesoftProxy.create(edit3.text, Edit4.text, edit5.text); Label1.Caption := 'Created'; except on e : Exception do messageDLG(e.Message, mtInformation, [mbOk], 0); end; try codesoftProxy.initialize; Label1.Caption := 'Initialized'; except on e : Exception do messageDLG(e.Message, mtInformation, [mbOk], 0); end;
Delphi-Quellcode:
Hat jemand eine Idee was falsch laufen könnte?
try
freeandnil(codesoftProxy); Image1.Picture := nil; Label1.Caption := 'Freed'; except on e : Exception do messageDLG(e.Message, mtInformation, [mbOk], 0); end; |
AW: FreeAndNil Problem
Was steht im Destruktor der Proxy-Klasse?
Die ActiveX-Klase scheint nicht richtig beendet zu werden Der Unterschied zum Testprogramm wird sein, das dieses nichts weiteres macht. |
AW: FreeAndNil Problem
Was meinst Du mit Destruktor Klasse?
Sorry für die doofe Frage, aber mit Active X Steuerelementen hab ich mich noch nie wirklich auseinander gesetzt.... Zum Testprogramm... Stimmt so nicht ganz... Bei meinem Programm was Produktiv eingesetzt wird, wird nach dem Start ein Etikett automatisch in der Preview angezeigt. Das Gleiche habe im Testprogramm gemacht... Wie gesagt der unterschied ist das im Testprogramm dann kein Fehler kommt, aber dafür in meinem Programm... |
AW: FreeAndNil Problem
Zitat:
Delphi-Quellcode:
ist ja wahrscheinlich nicht die eigentliche ActiveX-Klasse, sondern eine Klasse aus dieser Zwischenunit, die dein ehemaliger Kollege geschrieben hat, oder? Da TcodesoftProxy am Ende freigegeben wird, wird ja dessen Destruktor aufgerufen und der macht vielleicht dann irgendwas "komisches" mit der eigentlichen ActiveX-Klasse. Kurz: was also steht in
TcodesoftProxy
Delphi-Quellcode:
?
TcodesoftProxy.Destroy
|
AW: FreeAndNil Problem
FreeAndNil() ruft Object.Free() auf welches des Destruktor Object.Destroy() auf.
Diese muss dann dafür sorge, dass die ActiveX Instanz beendet wird. Meine Vermutung war/ist, da sich bei der neuen Version hier das Interface geändert hat. |
AW: FreeAndNil Problem
Also Du meinst diese Code Stelle
Delphi-Quellcode:
Die befindet sich in der Unit die von dem Kollegen Programmiert wurde der gekündigt hat...
destructor TcodesoftProxy.destroy();
begin slFormelList.free; slPicturesList.free; slDescriptionFields.free; try if bInizialized and not fTestMode then begin try closeDocuments(); finally appCodesoft.Quit; end; end; finally if bInizialized and not fTestMode then appCodesoft.Free; appCodesoft := nil; end; end; Aber wenn sich am Interface was geändert hat, warum krieg ich im Testprogramm den Fehler dann nicht? |
AW: FreeAndNil Problem
Macht die eigentliche Anwendung noch mehr?
Schau dir mal die API-Beschreibung an. |
AW: FreeAndNil Problem
Hmm glaub es liegt an dem CloseDocuments()
Im Testprogramm führt er die Stelle ohne Probleme aus... In meinem richtigen Programm führt er die Stelle auch aus, bleibt dann aber beim Quit hängen... Das mitm Destructor war schon mal ein guter Hinweis, Danke! |
AW: FreeAndNil Problem
In Deinem Programm steht
Code:
drin. Im Testprogramm nicht. Was bedeutet dieser Unterschied?
fnCloseProgram('Lppa.exe');
|
AW: FreeAndNil Problem
Wenn sich an der Schnittstelle etwas geändert haben sollte, könntest du auch mal versuchen, die Typbibliothek neu zu importieren. Das ist die Unit, die Delphi aus einer ActiveX-DLL erstellt, damit man aus Delphi heraus auf die Schnittstelle bequem zugreifen kann. In der Zwischen-Unit deines Ex-Kollegen müsste eine weitere Unit eingebunden sein wie codesoft_TLB.pas oder so ähnlich.
Diese Datei könntest du, um sie zu sichern, umbenennen und dann unter Delphi den Menüpunkt "Komponente->Komponente importieren" wählen. Dort dann Typbibliothek auswählen und dann die Codesoft-Bibliothek aus der Liste suchen und auswählen. Das Ergebnis lässt du dann in eine Unit in dein Projekt schreiben, der du dann wieder den selben Namen wie vorher geben solltest. Sollte sich dann an der Schnittstelle irgendwas geändert haben, bekommst du beim nächsten Compilieren wenigstens Fehlermeldungen. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 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