PB Déchargement DLL avec Socket

Résolu
zawab Messages postés 3 Date d'inscription lundi 15 mars 2004 Statut Membre Dernière intervention 8 mars 2011 - 8 mars 2011 à 16:18
zawab Messages postés 3 Date d'inscription lundi 15 mars 2004 Statut Membre Dernière intervention 8 mars 2011 - 8 mars 2011 à 22:12
Bonjour à tous,
J'ai écris une dll (Delphi6), qui permet de créer une connexion socket sur un serveur et d'envoyer et recevoir des messages. elle contient des fonctions qui permettent de gérer la connexion et la deconnexion et les échanges. tout ça fonctionne très bien.
j'ai fait un programme de test avec des boutons et un mémo pour tester la dll.
>>>par contre lorsque je ferme le programme, là j'ai un gros souci, la fenètre principale se décharge bien, mais par contre le programme continue de tourner en arrière plan. j'ai essayé tout ce que je pouvais pour fermer l'application proprement mais rien a faire, en particulier libérer le socket et les objets créés dans la DLL dans la clause finalization de la DLL. J'ai utilisé le code de RT15 pour charger la dll en statique ou en dynamique, sans succès. je n'ai utilisé que des pchar et des pointeurs sur des structures en paramètre des fonctions.
Il semble que des fenètres cachées ne soient pas déchargées ( 2 QWidget et 1 TApplication visible dans Winsight32). En débug, quand je ferme le programme, et que je break, dans la fenêtre CPU, ça boucle sur Ntdll.KiUserCallBackDispacher.

>>>Auriez vous une idée?
Merci d'avance.

4 réponses

zawab Messages postés 3 Date d'inscription lundi 15 mars 2004 Statut Membre Dernière intervention 8 mars 2011
8 mars 2011 à 22:12
Bonsoir,
Ca y est ça marche, il s'agissait d'une erreur dans les uses de la dll, j'avais QDialogs au lieu de Dialogs.
Merci encore pour votre aide.
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
8 mars 2011 à 16:51
La socket a une méthode Close qui permet de la fermer (Peut être est-elle appelée par la méthode Free). Il faudrait que tu utilise Close.

Libérer la socket dans finalization est peut être un problème. La finalisation s'effectue lors du déchargement de l'unité, qui n'a peut être pas lieu à cause de la socket justement. Pour vérifier facilement, tu peux mettre un ShowMessage ou un MessageBox dans finalization (Tu peux aussi déboguer la dll en lui définissant une application hôte).

Ensuite, je ne sais pas ce que tu fais dans ta dll, mais as tu fait attention à ShareMem ?

Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
8 mars 2011 à 17:09
Si tu as une form dans ta dll, il faut aussi suivre les recommandation de l'aide:

Pour écrire une DLL utilisant des fiches VCL, affectez le handle de la fenêtre principale de l'EXE hôte à la propriété Application->Handle de la DLL. Cela fait de la fiche de la DLL une partie de l'application hôte. N'affectez jamais la propriété Handle dans un EXE.
0
zawab Messages postés 3 Date d'inscription lundi 15 mars 2004 Statut Membre Dernière intervention 8 mars 2011
8 mars 2011 à 21:48
Merci de ton aide,
Je fais bien le Socket.close et j'ai essayé le socket.free dans finalization ou ailleurs dans le code ( fermeture de connexion) j'ai ajouté sharemem partout ça ne change rien, je n'ai pas de form dans la DLL.
j'ai mis un point d'arrêt dans FormClose et FormDestroy j'y passe bien, j'ai mis le FreeLibrary(hLibHandle); dans le FormClose toujours rien.
j'ai recréé deux fois le projet du programme, et de la dll. toujours pareil!
je ne sais plus quoi essayer!
0
Rejoignez-nous