Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   FreeAndNil Problem (https://www.delphipraxis.net/167646-freeandnil-problem.html)

Andidreas 11. Apr 2012 10:09

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:
    //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;
Beim schließen meines Programmes wird Codesoft wie folgt beendet:
Delphi-Quellcode:
  //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;
Im angehängten Bild seht ihr den Fehler den ich beim Schließen meines Programmes erhalte...


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:
  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;
Codesoft schließen:
Delphi-Quellcode:
  try
    freeandnil(codesoftProxy);
    Image1.Picture := nil;
    Label1.Caption := 'Freed';      
  except
    on e : Exception do
      messageDLG(e.Message, mtInformation, [mbOk], 0);
  end;
Hat jemand eine Idee was falsch laufen könnte?

mkinzler 11. Apr 2012 10:15

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.

Andidreas 11. Apr 2012 10:18

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...

Bbommel 11. Apr 2012 10:25

AW: FreeAndNil Problem
 
Zitat:

Zitat von Andidreas (Beitrag 1161182)
Was meinst Du mit Destruktor Klasse?

Delphi-Quellcode:
TcodesoftProxy
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
Delphi-Quellcode:
TcodesoftProxy.Destroy
?

mkinzler 11. Apr 2012 10:25

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.

Andidreas 11. Apr 2012 10:29

AW: FreeAndNil Problem
 
Also Du meinst diese Code Stelle
Delphi-Quellcode:
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;
Die befindet sich in der Unit die von dem Kollegen Programmiert wurde der gekündigt hat...

Aber wenn sich am Interface was geändert hat, warum krieg ich im Testprogramm den Fehler dann nicht?

mkinzler 11. Apr 2012 10:31

AW: FreeAndNil Problem
 
Macht die eigentliche Anwendung noch mehr?
Schau dir mal die API-Beschreibung an.

Andidreas 11. Apr 2012 10:35

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!

UliBru 11. Apr 2012 10:42

AW: FreeAndNil Problem
 
In Deinem Programm steht
Code:
fnCloseProgram('Lppa.exe');
drin. Im Testprogramm nicht. Was bedeutet dieser Unterschied?

Bbommel 11. Apr 2012 10:48

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 15:50 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