Comment puis-je m'assurer qu'une DLL n'est pas déchargée alors que des objets existent? Le problème est que, lorsque j'utilisais la gestion de mémoire explicite, je pouvais supprimer les objets dll avant de libérer la DLL, mais avec les pointeurs intelligents, je n'avais aucun contrôle sur l'ordre, détruisant ainsi la DLL. en essayant de libérer l'un des autres objets:C++: Problème de déchargement Dll
FlPtr est un simple des thats de classe de comptage refrence appelle AddRef et Release, au besoin
ExampleDll *dll = LoadDll(L"bin\\example.dll");
IObject *obj = dll->CreateObject();
...
obj->Release();
delete dll;//fine because all objects already deleted
return 0;
auto_ptr<ExampleDll> dll = LoadDll(L"bin\\example.dll");
FlPtr<IObject> obj = dll->CreateObject();
...
return 0;//crash if dll is destructed before obj since Object::Release needs to call into the dll
J'ai essayé de faire la poignée dll itsself déchargement, à savoir que le déchargement après tous les objets ont été supprimés. Ce travail en créant un nouvel objet IExampleDll que la DLL implémente. C'est comme l'objet ExampleDll d'avant mais vit dans le dll plutôt que l'exe et est également compté. Chaque objet de la DLL incrémente cette réfrence sur la construction et la désincrémente lors de la destruction. Cela signifie que le nombre de réfrences n'atteint que zéro lorsque l'exe a libéré ses réfrences ET que tous les objets dll ont été détruits. Il supprime ensuite itsself appelant FreeLibrary (GetModuleHandle()) dans son destructeur.
Cette plante cependant au FreeLibrary, Asuming im parce que le fil est toujours dans le code dll qui est déchargé ...
Je suis à une perte maintenant comment assurer que le dll n'est déchargé lorsque il n'y a pas d'objets restants, à part revenir à libérer la DLL explicitement après que tout le reste aurait dû être supprimé;
int main()
{
ExampleDll *dll = LoadDll("bin\\example.dll");
restOfProgram();
delete dll;
}
Cette approche devient difficile lorsque dll doivent être chargés/déchargés mi programme saftly, à savoir si l'utilisateur a modifié de D3D à opengl dans les options.
Ok, j'ai eu une pensée, et si la méthode Release() dlls retourné un booléen, faux s'il n'y avait pas de réfrences restantes, le DllPtr spécial pourrait appeler bibliothèque libre si Release retourné false –
Mais cela a toujours le problème de la dernière la réfrence étant supprimée dans la DLL si les DllPtr sont supprimés en premier ... Comment j'irais mettre en œuvre l'approche COM pour continuer à interroger la DLL après que la pile et les statiques (les globales) soient détruites car c'est alors seulement pas de ref? –
Vous aurez besoin d'une sorte d'objet "nettoyeur" qui n'est pas dans la DLL que vous déchargez pour décharger avec succès cette DLL, c'est à peu près ce que fait ole32.dll lorsque CoUnitialize est appelée. – Ismael