Pourquoi ne pas appeler FreeLibrary depuis la fonction de point d'entrée ?
-
19-09-2019 - |
Question
J'écris une DLL qui doit appeler une DLL distincte de manière dynamique plusieurs fois.Je voudrais garder l'appelé chargé, puis le décharger lorsque ma DLL est déchargée.Mais selon Microsoft, c'est un mauvaise idée.
La fonction de point d'entrée ne doit effectuer que des tâches d'initialisation simples et ne doit appeler aucune autre fonction de chargement de DLL ou de terminaison.Par exemple, dans la fonction du point d'entrée, vous ne devez pas appeler directement ou indirectement la fonction LoadLibrary ou la fonction LoadLibraryEx.De plus, vous ne devez pas appeler la fonction freelibrary lorsque le processus se termine.
Voici le code incriminé.Quelqu'un peut-il expliquer pourquoi je ne devrais pas appeler LoadLibrary et FreeLibrary depuis le point d'entrée de ma DLL ?
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call) {
case DLL_PROCESS_DETACH :
if (hLogLib != NULL) FreeLibrary(hLogLib);
break;
}
return TRUE;
}
La solution
Je pense que je l'ai trouvé la réponse .
La fonction point d'entrée doit effectuer uniquement l'initialisation simple, ou tâches de résiliation. Il ne doit pas appeler le LoadLibrary ou LoadLibraryEx fonction (ou une fonction qui appelle ces fonctions), parce que cela peut créer des boucles de dépendance dans la DLL ordre de chargement. Cela peut entraîner une DLL étant utilisée avant que le système comporte exécuter le code d'initialisation. De même, la fonction de point d'entrée ne doit pas appeler la fonction FreeLibrary (Ou une fonction qui appelle FreeLibrary) au cours de la fin du processus, parce que cela peut entraîner une DLL utilisée après que le système a exécuté son un code de terminaison.
Autres conseils
Vous ne pouvez pas appeler LoadLibrary à partir de votre point d'entrée parce que la fonction DllMain passe à l'intérieur d'un verrou de chargeur OS et toute tentative de réacquérir que le verrouillage du chargeur (par exemple, en appelant LoadLibrary) entraînera dans une impasse.
Ne fais pas quoi que ce soit d'important à l'intérieur de DLLMain.Sérieusement.Appeler FreeLibrary est encore pire car cela ne fera que parfois impasse, s'il arrive que votre free décrémente le refcount à zéro et que la bibliothèque soit effectivement libérée.