LoadLibrary échoue: exception de Première chance 0xC0000139 (DLL Non Trouvé) - Comment déboguer?
J'ai une dll "mytest.dll" que lorsqu'il est chargé par LoadLibrary()
, renvoie la valeur NULL (et 127 le GetLastError()
). Si j'utilise DependencyWalker sur "mytest.dll", il signale qu'il doit charger correctement et que toutes les Dll correctement. L'exécution de l'profiler option de DependencyWalker sur l'hôte exe me donne cette section correspondante dans le journal:
00:00:55.099: Chargé "mytest.DLL" à l'adresse 0x07860000 par fil 0xBBC. Réussi à raccorder le module. 00:00:55.115: exception de Première chance 0xC0000139 (DLL Non Trouvé) s'est produite dans "NTDLL.DLL" à l'adresse 0x76E24285 par fil 0xBBC. 00:00:55.115: Déchargé "mytest.DLL" à l'adresse 0x07860000 par fil 0xBBC. 00:00:55.115: LoadLibraryW("mytest.dll") retourné NULL par fil 0xBBC. Erreur: La procédure spécifiée est introuvable (127).
Est-il un moyen de débogage pour savoir ce que la DLL Pas Trouvé de message NTDLL.DLL les rapports essaie de trouver? Ou dois-je chercher ailleurs la source du problème?
Noter que le chargement de ce même "mytest.DLL" à partir d'une autre application semble fonctionner correctement.
N'importe quel de nos réponses aider à résoudre ce problème?
OriginalL'auteur PeteVasi | 2009-04-27
Vous devez vous connecter pour publier un commentaire.
Votre demande d'essayer d'appeler une DLL spécifique via la fonction GetProcAddress après le chargement initial (peut-être) qui n'est pas trouvé? C'est un 32 ou 64 bits?
Si elle est en cours de chargement correctement dans une autre application comme vous le suggérez, alors il a probablement un point d'entrée correcte.
Un rapide recherche google suggère que le code d'erreur que vous obtenez de retour est probablement à partir d'un nom de fonction manquant (ou d'une fonction spécifique de la valeur ordinale) dans la DLL. Je vous suggère de l'ouverture de la DLL dans quelque chose comme Exescope et inspecter la liste des exports.
Il pourrait également expliquer pourquoi la DLL fonctionne avec une autre application (peut-être l'autre application utilise différentes fonctions exportées dans le DLL)?
OriginalL'auteur RobS
À l'aide de Le Moniteur De Processus ou FileMon de SysInternals pourrait vous donner un indice si myTest.dll n'est tout simplement pas où il est recherché.
OriginalL'auteur Michael Burr
DependencyWalker montre dépendances implicites (les dépendances sont gérées automatiquement par le chargeur de Windows). Dll que vous chargez avec LoadLibrary sont des dépendances explicites et DependencyWalker n'a aucun moyen de les trouver (par exemple, les noms de bibliothèque peut être lu à partir d'un fichier ini, et il n'ya aucun moyen que DependencyWalker pourrait en déduire ce).
Il n'est pas inhabituel pour une DLL pour travailler dans une application et pas dans un autre. Dans le scénario le plus courant, une application a déjà une dll requis chargé et l'autre pas. Si la dll n'est pas sur le chemin, votre fichier dll travaillera dans le premier cas et non dans la seconde.
De toute façon, aller avec Michael Bavure de la suggestion et de l'utilisation de FileMon. Même si le site web SysInternals dit que FileMon est obsolète, il est toujours beaucoup plus facile à utiliser que ProcMon.
OriginalL'auteur jdigital