J'ai une erreure recurente au cours de mon dev qui me perturbe un peu.
A chaques fois je trouve uen astuce pour la contourner mais sans vraiement la resoudre.
Le projet :
Une dll exporte une classe type Plugin qui manipule divers objets de ma dll.
L'ensemble des objets et du plugin est lié a ma classe exporté (Constructeur/Destructeur)
Cette classe est exportee par une fonction GetPlugin et manipulee via son interface.
L'exe lui implemente une classe descendant de TComponent pour plus tard y acceder depuis la palete d'outils Delphi.
elle charge l'interface via la methode GetPlugin de la Dll et la stocke dans uen variable privee. Plusieurs methodes sont developpés pour acceder et appeler les methodes de l'inteface.
Cette classe "composant" implemente une interface Events (sur les precedents conseils du Troll de developpez ) qu'elle transmet a la classe de la Dll via une methode SetEvents(Self).
La classe dans la Dll manipule cette interface et donc les methodes de mon TComponent depuis uen variable interface qu'elle pense bien sur a mettre a nil lors de sa destruction.
Apres verification l'affectaiton a nil d'une interface n'implique pas de destruction du TComponent contrairement a TInterfaceObject.
Mon TComponent dans l'exe est actuelement cree dynamiquement mais possede pour owner la form de test. donc normalement se detruit lorsque la form se detruit, et ferme ainsi la dll.
Le probleme
Lorsque je ferme mon application, dans certains cas, j'ai une erreur si je ne fait pas de free sur mon plugin dans l'event OnCLose de ma form ....
Ce qui semble poser un probleme dans mon application c'est la gestion des logs.
Dans la Dll j'ai 2 classes : Tcore et TLogs. TLogs.OnAddLine utilise TCore.AddLineEvent comme gestionnaire.
TCore.AddLineEvent(String) utilise l'interface Events pour appeler la methode AddLogLine(ShortString) stdcall de l'interface Events : IEvents,
Dans l'exe ma classe TPlugin(TComponent, IVents) j'implemente AddLogLine(ShortString) qui appelle le gestionnaire utilisateur via DoAddLogLine(String).
Dans ma Form J'ai donc une methode affectee dynamiquement a Mon Plugin lors du FormCreate : PluginAddLogLine(Sender, String) qui ajoute a une list box placée en mode design sur ma form.
Pourquoi c'est les chaines de log lancées dans lors de la destruction du Plugin (TForm.Free -> TPlugin.Free -> |EXE<>DLL|-> TCore.Free -> TLog.Free) qui paralisent laissent l'applciation dans un etat "zombi" finissant par une exception.
Lors de chaques free, je fais met bien tous mes pointeurs a Nil (interfaces, gestionnaires, etc ....)
Si vous avez des pistes je peux poster du code plus precis
Dans l'exe,
Partager