2017-09-11 4 views
2

J'ai un programme simple qui charge une DLL à partir du chemin courantloadlibrary échoue pour le chemin courant avec GetLastError() == 0

#include <iostream> 
#include <windows.h> 

using namespace std; 

auto loaddll(const char * library) { 
    auto dllModule = LoadLibrary(library); 
    if(dllModule == NULL) 
     throw "Can't load dll";  
    return dllModule; 
} 

int main() { 
    try { 
     auto Handle = loaddll("ISab.dll"); 
    } catch(const char * error) { 
     cerr << "An Unexpected error :" << error << endl; 
     cerr << "Get Last Error : " << GetLastError(); 
    } 
} 

la bibliothèque de chargement échoue pour chaque DLL dans le chemin en cours, mais réussit à DLL comme User.dll

si je l'ai couru la sortie sera comme

An Unexpected error :Can't load dll 
Get Last Error : 0 

cela échoue aussi si je spécifie le chemin complet à dll

+6

Sinon, il pourrait être écrasé par des appels système internes, dans ce cas, lors de la sortie de 'cerr'. – zett42

+1

Ne changez pas une question en une autre, invalidant ainsi les réponses que vous avez déjà reçues. J'ai annulé vos changements. – IInspectable

Répondre

5

Lorsqu'un appel API Win32 échoue et définit le code d'erreur, vous devez appeler GetLastError avant d'appeler toute autre fonction de l'API Win32. Tu ne fais pas ça. La génération d'une exception, la diffusion vers cerr etc. sont tous susceptibles d'appeler d'autres fonctions de l'API Win32 et ainsi de réinitialiser le code d'erreur.

Votre code doit ressembler à ceci:

auto dllModule = LoadLibrary(library); 
if (dllModule == NULL) 
    auto err = GetLastError(); 

Une fois que vous avez le code d'erreur, vous devriez être mieux placé pour comprendre pourquoi le module n'a pas pu être chargé. codes d'erreur courants pour LoadLibrary comprennent:

  • ERROR_MOD_NOT_FOUND ce qui signifie que le module, ou une de ses dépendances, ne peuvent pas être localisées par la recherche de DLL.
  • ERROR_BAD_EXE_FORMAT ce qui signifie invariablement une incompatibilité 32/64 bits, soit avec le module que vous chargez, soit avec l'une de ses dépendances. GetLastError() `est supposé être appelé * immédiatement * après la fonction qui a provoqué l'erreur.
+0

oui vous avez raison getlasterror est 193 – bluedragon

+0

'implémenter une classe d'exception personnalisée' - dans la plupart des cas' std :: system_error' sera suffisant. – zett42

+0

C'est ERROR_BAD_EXE_FORMAT n'est ce pas. –