J'écris une DLL qui a besoin d'appeler dynamiquement une DLL séparée plusieurs fois. Je voudrais garder l'appelé chargé et juste le décharger quand ma DLL est déchargée. Mais selon Microsoft, c'est un bad idea.Pourquoi ne pas appeler FreeLibrary depuis la fonction de point d'entrée?
La fonction de point d'entrée doit seulement effectuer des tâches d'initialisation simples et ne doit pas appeler d'autres fonctions de chargement ou de cessation d'emploi DLL . Pour exemple, dans la fonction de point d'entrée, vous ne devez pas directement ou indirectement appeler la fonction LoadLibrary ou la fonction LoadLibraryEx . De plus, vous ne devez pas appeler la fonction FreeLibrary lorsque le processus est se terminant.
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;
}
Comment savez-vous que la DLL n'a pas déjà été déchargée? –
@Anon: Je ne le fais pas. En fait, je ne sais pas si c'était même chargé. Mais s'il a été chargé et n'a pas déjà été déchargé, je veux le décharger. –
Des sons semblables à vous devraient être liés statiquement à l'autre DLL, plutôt que d'essayer de le charger dynamiquement. –