2010-06-10 23 views
0

Je programme sur C++, j'utilise Visual Studio 2008, Windows XP et j'ai le problème suivant: Mon application , c'est une DLL qui peut être utilisée à partir de Python, charge une DLL externe, utilise les méthodes requises, puis décharge cette DLL externe. Cela fonctionne correctement, mais après plus de 1000 cycles, la méthode "LoadLibraryA" renvoie une référence NULL.La méthode LoadLibraryA renvoie le code d'erreur 1114 (ERROR_DLL_INIT_FAILED) après plus de 1000 cycles de chargement/déchargement

Les principales étapes sont les suivantes:

HINSTANCE h = NULL; 
h = LoadLibraryA(dllfile.c_str()); 
DWORD dw = GetLastError(); 

L'erreur s'est:

ERROR_DLL_INIT_FAILED 
1114 (0x45A) A dynamic link library (DLL) initialization routine failed. 

Le dll est déchargé en utilisant les éléments suivants:

FreeLibrary(mDLL); 
mDLL = NULL; 

Où MDLL est défini comme celui-ci :

HINSTANCE mDLL; 

Première alternative essayée: Il suffit de charger la DLL une seule fois et de la décharger à la fin de l'application. Cela corrige le problème mais en introduit un nouveau.

Lorsque l'application se termine, au lieu d'exécuter d'abord la méthode DllMain de mon application, qui décharge la DLL externe, exécute d'abord la méthode DllMain de l'autre Dll. Cela provoque l'erreur suivante car mon application essaie de décharger une DLL qui était déchargée par elle-même précédemment. "Exception non gérée à 0x04a00d07 (DllName.DLL) dans Python.exe: 0xC0000005: violation d'accès emplacement de lecture 0x0000006b".

Toute suggestion sera la bienvenue. Merci d'avance. Cordialement.

+1

Comment publier le code DLL approprié pour que nous puissions vous aider à trouver le bogue? –

+0

On dirait que vous appelez LoadLibrary et FreeLibrary dans votre DllMain. Ne fais pas ça; C'est une recette pour le désastre. – Luke

+0

Avez-vous déjà trouvé la cause du problème? Je cours dans la même chose où LoadLibrary/FreeLibrary a été appelé quelques centaines de fois et ensuite je reçois la même erreur. Mon application est tout C++, pas de python impliqué. –

Répondre

0

Assurez-vous que le code d'initialisation de la bibliothèque chargée/déchargée ne fuit pas la mémoire. De nombreuses bibliothèques ne s'attendent à être chargées qu'une seule fois et ne nettoient pas toujours leurs ressources correctement.

E.g. dans le dossier de C au niveau haut, on peut déclarer et initialiser une variable comme ceci:

AClass *a = new AClass(1,2,3); 

Le code serait exécuté lorsque bibliothèque est chargée automatiquement. Pourtant, maintenant, il est impossible de libérer l'instance suspendue car la bibliothèque ne sait pas précisément quand/comment elle va être déchargée. Dans le cas, vous pouvez remplacer "AClass * a" par "AClass a" ou écrire votre propre DllMain pour la bibliothèque et les ressources libres sur DLL_PROCESS_DETACH.

Si vous n'avez aucun contrôle sur le code de la bibliothèque, il peut être judicieux de créer un cache de bibliothèques chargées et de ne jamais les décharger. Il est très difficile d'imaginer qu'il y aurait un nombre illimité de bibliothèques pour surcharger un tel cache.