![]() |
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:
Hat jemand eine Idee, wie das frühzeitige Entladen vermieden werden kann?
var
GDRipExtension : IOTAWizard; procedure Register; begin GDRipExtension := TDRipExtension.Create; RegisterPackageWizard(GDRipExtension); end; |
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.
|
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:
Der Konstruktor wird an keiner anderen Stelle verwendet, also es wird keine Referenz gehalten.
procedure Register;
var dripExtension : IOTAWizard; begin dripExtension := TDRipExtension.Create; RegisterPackageWizard(GDRipExtension); end; 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. |
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:
Vielleicht hilft dir das ja weiter.
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; |
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.
|
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