2009-10-18 7 views
2

J'ai une DLL qui est en fait un service com qui est enregistré et ensuite chargé par un autre processus .exe. Je voudrais quand l'utilisateur quitte le fichier .exe pour exécuter certaines étapes de fermeture de ressources à partir de ma DLL avant qu'il ne soit trop tard. J'ai essayé d'intercepter le DLLPROCESSDETACH ou DLLTHREADDETACH à partir du DllMain de ma DLL mais il semble que quand il y arrive, il est déjà trop tard car les threads démarrés par ma DLL (dont j'ai besoin pour exécuter les étapes de fermeture) ont déjà arrêté ?! Bien sûr, je ne contrôle pas le code .exe sinon j'aurais appelé à partir de là un appel pour exécuter ces étapes de fermeture propres avant qu'il ne se termine. Je ne peux travailler que sur la DLL elle-même. Il ne semble pas que le DllCanUnloadNow ou le DllUnregisterServer soient appelés non plus.Comment savoir si le fichier .exe chargé par ma DLL est sur le point de sortir?

Est-ce que quelqu'un peut contourner cette situation?

Merci beaucoup d'avance pour toutes les entrées.

Répondre

1

Vous pouvez écrire un objet statique avec dtor, le dtor sera appelé une fois que le service est en train de quitter et que le cruntime est sur le point de se décharger.

struct CDtorMyDll 
{ 
    ~CDtorMyDll 
    { 
    // do cleanup stuff here. 
    } 
}; 

static CDtorMyDll dtorMyDll; 
+0

Ne fonctionne pas, car ils sont appelés à partir de 'DLLPROCESSDETACH' – MSalters

0

Question stupide: Pourquoi avez-vous besoin d'exécuter les threads que vous avez créés? Ils vont être détruits de toute façon et toutes les ressources utilisées par le processus seront nettoyées. Cela dit, si votre objet est vraiment un objet COM, vous pouvez ajouter du code à votre appel DllCanUnloadNow pour détecter s'il existe des instances en attente de vos objets et s'il n'y en a pas, nettoyez vos ressources. Cela ne fonctionnera pas si le processus fuit des références à vos objets ou n'appelle pas CoUninitialize, mais si le processus hébergeant votre objet suit les règles, il vous donne l'opportunité de nettoyer avant que le processus ne s'arrête.

0

Si vous essayez de le faire via DllMain ou un destructeur, cela créera des bizarreries, car la DLL elle-même sera dans un état étrange (lisez tous les articles de Raymond Chen sur DllMain et vous verrez).

La vraie solution consiste ici à avoir des fonctions explicites MyDllInitialize() et MyDllTeardown() qui sont appelées avant la fermeture du processus.

Questions connexes