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;
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top