vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
7 mai 2009 à 21:11
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
7 mai 2009 à 21:49
Bonjour,
J'ai un programme qui parcourt les ressources contenues dans une dll fournie par l'utilisateur, j'utilise donc LoadLibrary/FreeLibrary pour les charger et les décharger.
J'observe un comportement très bizarre lorsque la dll est une copie de kernel32.dll. Exemple (aaa.dll est une copie de kernel32.dll) :
int main()
{
HMODULE hMod;
BOOL bRet;
hMod = LoadLibrary(TEXT("C:\\test\\aaa.dll")); // OK
bRet = FreeLibrary(hMod); // OK
hMod = LoadLibrary(TEXT("C:\\test\\aaa.dll")); // Exception de première chance -> hMod = 0
// A partir de la plus rien ne marche, je ne peux plus faire de LoadLibrary sur cette dll
bRet = FreeLibrary(hMod);
hMod = LoadLibrary(TEXT("kernel32.dll")); // OK
bRet = FreeLibrary(hMod); // OK
hMod = LoadLibrary(TEXT("kernel32.dll")); // OK
bRet = FreeLibrary(hMod); // OK
}
Ce qui est bizarre c'est qu'en utilisant le kernel32.dll du système je n'ai aucun problème.
Je n'ai pas ce problème avec d'autres dll système...
Je vois que LoadLibrary et FreeLibrary sont définies dans kernel32.dll, je me demande si c'est une coïncidence.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 7 mai 2009 à 21:42
Utilise LoadLibraryEx avec LOAD_LIBRARY_AS_IMAGE_RESOURCE si c'est juste pour explorer les ressources de la DLL.
Sinon avec DONT_RESOLVE_DLL_REFERENCES tu éviteras l'appel du point d'entrée de la DLL, surement ce qui merde avec la copie de kernel32.dll.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 7 mai 2009 à 21:49
Ah oui j'avais pas pensé à LoadLibraryEx!
Avec DONT_RESOLVE_DLL_REFERENCES ca marche nickel. Je vais utiliser plutot ca que LOAD_LIBRARY_AS_IMAGE_RESOURCE pour garder une compatibilité avec XP.