LoadLibrary() code d'erreur 127
Je vais avoir des ennuis avec la fonction LoadLibrary() et obtenir une erreur qui n'a pas de sens pour moi:
::SetLastError(0);
m_hDll = ::LoadLibrary(szName);
if (m_hDll == NULL) //Failure to load the DLL.
{
DWORD err = GetLastError();
}
L'erreur est de 127 ("La procédure spécifiée est introuvable.") Ça n'a aucun sens pour moi sur un appel à LoadLibrary(). Je n'ai pas appelé GetProcaddress() pour le moment.
La DLL (et la demande) sont à la fois compilé avec VS++ 2005 SP1.
Ce qui pourrait mal se passer?
Peut-être il n'y a pas
Si
DllMain
dans la bibliothèque? En cas d'échec ::LoadLibrary
?Si
DllMain
"jeux de la dernière erreur' 127 puis retourne FALSE
, "la dernière erreur' être remplacé par le système avant de retourner à partir de ::LoadLibrary
?OriginalL'auteur Adam Tegen | 2009-06-27
Vous devez vous connecter pour publier un commentaire.
Prenons cette étape par étape:
Le message d'erreur signifie que la dll a été trouvé, mais une fonction requise est manquante. (Jitter est à droite.) Cela implique que vous avez la dll que vous avez besoin, mais pas la bonne version. (Davefiddes est droit, bien que le problème peut être n'importe quelle dll, et pas seulement le Microsoft de la bibliothèque d'exécution. Et, au moins pour les principales mises à jour, Microsoft donne à ses bibliothèques d'exécution des noms différents, donc dans ce cas ce ne serait pas un problème.)
Ce n'est pas logique, parce qu'aucune fonction n'a été demandée à partir de la dll en cours de chargement. (Adam est à droite.)
Par conséquent, l'absence de la fonction a été prévu se trouve pas dans le dll qui est chargée explicitement par la fonction LoadLibrary de commande, mais dans une situation de dépendance dll qui est chargée implicitement dans le même temps, parce que la dll exige. (Zebrabox était proche.)
Charge dll est une dll qui est "statique", liée à la bibliothèque d'être chargés de manière explicite, par l'intermédiaire d'une bibliothèque d'importation, ou .fichier lib, inclus sur le linker étape de la chargée explicitement dll. (Je parie que vous ne savais pas qu'un "dynamic link library" pourrait être "lié statiquement." Eh bien, maintenant vous le savez.)
Si vous avez plusieurs versions de la même dll dans des dossiers différents, alors ce pourrait aussi être un chemin de recherche de problème (comme zebrabox l'indique). Dll chemin d'accès de l'ordre de recherche est un sujet complexe en lui-même: voir http://msdn.microsoft.com/en-us/library/ms682586(SV.85).aspx . Cela dépend du système d'exploitation, entre autres choses. Le pari le plus sûr, lorsque c'est possible, est de mettre tout le potentiel problème de dll dans le même dossier que votre fichier exe.
Dépendante de la dll peuvent également avoir leur propre dépendant de la dll, ce qui en fait un problème très difficile à résoudre. Dépend peut aider, mais si elle ne l'est pas, essayez de filemon. La dernière dll qui a réussi à lire avant de votre message d'erreur est celui qui n'est pas la bonne version.
OriginalL'auteur Michael
Microsoft gflags outil sera toujours de vous dire exactement ce que la dépendance est l'échec du chargement et pourquoi.
Exécuter
gflags -i your_application.exe +sls
. Après cela, exécutez l'application sous le débogueur pour capturer le chargeur de traces.gflags fait partie de Outils De Débogage, vous pouvez vérifier dans
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
pour voir si vous l'avez déjà. Vous pouvez ajouter ce répertoire à votre chemin d'accès, ou tout simplement exécuter gflags à partir de ce répertoire cmd.exe.Par exemple, après l'exécution de gflags, placez un point d'arrêt sur la
::LoadLibrary(_T("foo"))
appel et pas sur elle tout en regardant pour loader des erreurs dans votre fenêtre de sortie Visual Studio, par exemple,Cela signifie que lors de la charge de
foo.dll
, la dépendancebar.dll
a été importé, etbar.dll
échec de l'importation.La dépendance à l'importation a échoué parce que la procédure
?SetObject@vis_DollarMap@@QEAAXHPEAX@Z
était manquant -- vous pouvez demangle que pourpublic: void __cdecl vis_DollarMap::SetObject(int,void * __ptr64) __ptr64
.Vous avez probablement la mauvaise version d'une dépendance, peut-être que vous avez besoin de reconstruire la dépendance à l'obtenir jusqu'à ce jour.
Exécuter
gflags -i your_application.exe -sls
par la suite pour désactiver le chargeur de traces.OriginalL'auteur JDiMatteo
Le messag d'erreur signifie qu'il y a une DLL en trouve, mais une procédure obligatoire pour l'exportation est manquant. Vous avez la bonne version de la DLL?
Vous pouvez utiliser
dumpbin.exe
de vérifier quelles sont les fonctions de votre DLL exportations et vérifier l'orthographe.Vous avez raison. Qui a voté +1? :\
OriginalL'auteur jitter
Installer les outils de Débogage et d'exécuter le
gflags -i your_application.exe +sls
. Après que l'exécution de l'application sous le débogueur pour capturer le chargeur de traces.OriginalL'auteur Dmitri Zhuchkov
Avez-vous un décalage entre le temps de fonctionnement utilisé pour votre application et la DLL?
Un problème qui me piquer avec VS 2005 dans le passé, c'est qu'une partie est construite comme une Libération de construire et les autres comme une version de Débogage. Ces tirez dans les différentes versions de Microsoft runtime Dll qui sont incompatibles que vous ne pouvez avoir qu'un chargé dans un processus donné.
Je pense que la raison que vous voyez l'Erreur 127 est parce que votre DLL est à la recherche d'une fonction dans l'chargé runtime DLL, ce qui n'est pas là parce que c'est le mauvais moment de l'exécution.
OriginalL'auteur davefiddes
Deux suppositions de moi
1. LoadLibrary appelle la fonction DllMain de la DLL spécifiée (la première fois que vous essayez de joindre à votre processus). Long shot, mais elle est là?
2. LoadLibrary va charger la DLL spécifiée et toutes ses dépendances. Donc, si une personne à la charge du module de la DLL ne peut pas être situé dans le chemin de recherche qui sera la cause de la charge à l'échec - vous pouvez utiliser depends.exe le check - disponible ici
OriginalL'auteur zebrabox
J'ai fait le même code d'erreur après l'appel de la fonction LoadLibrary(). Enfin trouvé grâce à dependency walker que certaines dépendances du module (szName) manquaient à l'appel.
OriginalL'auteur Jatin Sanghvi
Je conseille Dependency Walker de savoir quelle méthode est manquant ou ce que les Dll sont nécessaires ou manquants.
OriginalL'auteur Damian Dixon