2011-05-27 6 views
0

J'ai un projet que j'ai converti à partir de Visual Studio 2003 .NET vers Visual Studio 2010. Ce n'est pas un projet .NET; c'est Visual C++ (non géré).LoadLibrary échoue; GetLastError pas d'aide

La DLL extrait des DLL supplémentaires. Si je lier un exécutable avec cette DLL, alors l'exécutable meurt pendant l'initialisation de la DLL. (Je peux dire, il y a des constructeurs pour les objets statiques qui sont appelés, et je peux voir leur fonctionnement.) J'ai enlevé TOUS les DLL créés par VS 2010 de mon chemin, excepté l'un d'entre eux, qui cause l'erreur. Remplacer celui-là avec la version créée par VS.NET permet au programme de s'exécuter. Comme je ne reçois aucune information utile, j'ai décidé d'écrire une application de test qui ne soit pas directement liée à la DLL, mais qui utilise LoadLibrary pour charger la bibliothèque. L'idée était que je pourrais utiliser GetLastError() pour aider à comprendre le problème avec la bibliothèque. Ne pas aller; Je reçois un code d'erreur -529697949, qui n'est pas du tout un code d'erreur Windows! (Si je change la DLL à la version créée par VS.NET, le programme charge la DLL correctement.)

J'ai utilisé le Dependency Walker (www.dependencywalker.com) pour vérifier la DLL, et il me dit que " Au moins un module de dépendance de charge de retard n'a pas été trouvé ", mettant en évidence IESHIMS.DLL et WER.DLL. Je ne vois aucune autre erreur avec cet outil. L'exécuter sur la DLL créée par VS.NET montre les mêmes deux avertissements, donc je pense que c'est un faux-fuyant.

static void showMessage(const wchar_t *wmsg) 
{ 
     std::wcout << wmsg << std::endl; 
     ::MessageBox(NULL, wmsg, TEXT("Message"), MB_OK); 
} 

static void testLoadLibrary(const wchar_t *lib) 
{ 
     ::SetLastError(0L); 
     ::SetErrorMode(0); 

     std::wstringstream wss; 

     wss << "LoadLibrary: " << lib; 
     showMessage(wss.str().c_str()); 
     HINSTANCE LoadME = ::AfxLoadLibrary(lib); 
     if (LoadME == NULL) { 
       DWORD dw = ::GetLastError(); 
       wss << "Failed: Error code " << dw; 
       showMessage(wss.str().c_str()); 
       ErrorExit(lib, dw); 
     } else { 
       wss << "LoadLibrary of " << lib << " succeeded."; 
       showMessage(wss.str().c_str()); 
       ::FreeLibrary(LoadME); 
     } 
} 

Enfin, j'ai couru Process Monitor (sysinternals.com) pour surveiller le programme de test, regardant toutes les entrées avec chemin contenant la chaîne "dll". Je ne vois rien de particulièrement informatif dans cette liste - aucune idée de la raison pour laquelle la DLL ne se charge pas. Si j'utilise LoadLibraryEx avec DONT_RESOLVE_DLL_REFERENCES, la bibliothèque se charge, donc cela ressemble vraiment à un problème de dépendance, c'est pourquoi je suis surpris que le walker de dépendances ne soit pas particulièrement utile. J'ai essayé ceci sur Windows 2008 R2 et Windows 2003; même comportement.

Des suggestions?

Répondre

2

Il existe un outil OS pour aider à diagnostiquer des problèmes comme celui-ci. Téléchargez le SDK ou le DDK et utilisez gflags.exe pour définir 'Show Loader Snaps' (+ sls) pour le processus. Cela devrait révéler pourquoi la charge DLL échoue.

La sortie d'accrochage du chargeur apparaît dans la fenêtre de sortie du débogueur.

Martyn

+0

Merci pour votre aide. Il a isolé ma DLL comme problème, mais n'a pas expliqué pourquoi. Il semble qu'une définition de classe dérivée de CWinApp est probablement le culprint; Je ne sais pas pourquoi il a été inclus dans la DLL et la suppression du fichier .cpp du projet permet à la bibliothèque de se charger sans erreur. – lar3ry

+0

Le projet est-il basé sur MFC? La DLL MFC correspondante est-elle installée? Avez-vous mélangé le débogage et sorti des trucs compilés? –

Questions connexes