PB Déchargement DLL avec Socket [Résolu]

Messages postés
3
Date d'inscription
lundi 15 mars 2004
Dernière intervention
8 mars 2011
- 8 mars 2011 à 16:18 - Dernière réponse :
Messages postés
3
Date d'inscription
lundi 15 mars 2004
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.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
3
Date d'inscription
lundi 15 mars 2004
Dernière intervention
8 mars 2011
- 8 mars 2011 à 22:12
3
Merci
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.

Merci zawab 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de zawab
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 8 mars 2011 à 16:51
0
Merci
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.
Commenter la réponse de cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 8 mars 2011 à 17:09
0
Merci
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.
Commenter la réponse de cs_rt15
Messages postés
3
Date d'inscription
lundi 15 mars 2004
Dernière intervention
8 mars 2011
- 8 mars 2011 à 21:48
0
Merci
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!
Commenter la réponse de zawab

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.