Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   DllExpert unit wird finalisiert bevor richtig unregistriert (https://www.delphipraxis.net/216477-dllexpert-unit-wird-finalisiert-bevor-richtig-unregistriert.html)

mattia72 4. Jan 2025 13:20

DllExpert unit wird finalisiert bevor richtig unregistriert
 
Hallo,

ich habe ein DLL Expert, der gut funktioniert bis ich die IDE schließe.
Dann tritt nämlich eine EAccessViolation Exception auf.

Ich habe herausgefunden, dass die Unit wo ich die IOTAWizard Interface implementiert habe, wird finalisiert before der Destructor aufgerufen wird.

Soviel ich weiß es reicht, wenn man die Extension so registriert:

Delphi-Quellcode:
var
   GDRipExtension : IOTAWizard;

procedure Register;
begin
   GDRipExtension := TDRipExtension.Create;
   RegisterPackageWizard(GDRipExtension);
end;
Hat jemand eine Idee, wie das frühzeitige Entladen vermieden werden kann?

Uwe Raabe 4. Jan 2025 13:30

AW: DllExpert unit wird finalisiert bevor richtig unregistriert
 
Ich vermute, die globale Variable hält das Interface zu lange. Solange du die nicht noch woanders nutzt, solltest du daraus eine lokale Variable in der Register procedure machen.

mattia72 4. Jan 2025 16:15

AW: DllExpert unit wird finalisiert bevor richtig unregistriert
 
Das hat leider nicht geholfen. Ursprünglich gab es überhaupt keine Variable und so ging es auch nicht.

Delphi-Quellcode:
procedure Register;
var
   dripExtension : IOTAWizard;
begin
   dripExtension := TDRipExtension.Create;
   RegisterPackageWizard(GDRipExtension);
end;
Der Konstruktor wird an keiner anderen Stelle verwendet, also es wird keine Referenz gehalten.
Egal was ich mache, in welche Reihenfolge die Units in der DPR Datei aufgelistet sind, Finalization wird zu früh aufgerufen, obwohl diese Unit sollte eigentlich zuletzt entladen werden.

Uwe Raabe 4. Jan 2025 16:41

AW: DllExpert unit wird finalisiert bevor richtig unregistriert
 
Die Methode RegisterPackageWizard habe ich selbst noch nicht benutzt. Der MMX Code Explorer registriert sich über eine exportierte
Delphi-Quellcode:
function InitExpert
:
Delphi-Quellcode:
procedure FinalizeWizard;
begin
  if MMOTAExpertIndex <> -1 then (BorlandIDEServices as IOTAWizardServices).RemoveWizard(MMOTAExpertIndex);
  MMOTAExpertIndex := -1;
end;

function InitExpert(const BorlandIDEServices: IBorlandIDEServices;
    RegisterProc: TWizardRegisterProc;
    var Terminate: TWizardTerminateProc): Boolean stdcall;
begin
  Result := True;
  Terminate := FinalizeWizard;
  MMOTAExpertIndex := (BorlandIDEServices as IOTAWizardServices).AddWizard(TMMXBDSExpert.Create);
end;

exports InitExpert name WizardEntryPoint;
Vielleicht hilft dir das ja weiter.

Uwe Raabe 4. Jan 2025 16:46

AW: DllExpert unit wird finalisiert bevor richtig unregistriert
 
Womöglich relevant: In der Doku wird bei RegisterPackageWizard immer von design-time packages gesprochen. Der MMX Code Explorer ist aber eine DLL, die im Experts Registry-Key eingetragen ist - also kein Design-BPL.

mattia72 4. Jan 2025 19:45

AW: DllExpert unit wird finalisiert bevor richtig unregistriert
 
Danke.
Mit IOTAWizardServices.AddWizard und IOTAWizardServices.RemoveWizard funktioniert es ohne Exception :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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 by Thomas Breitkreuz