Ошибка LoadLibrary: исключение первого шанса 0xC0000139 (DLL не найдена) - Как отладить? - PullRequest
5 голосов
/ 28 апреля 2009

У меня есть dll "mytest.dll", который при загрузке через LoadLibrary() возвращает NULL (и 127 как GetLastError()). Если я использую DependencyWalker на "mytest.dll", он сообщает, что он должен загружаться правильно и все библиотеки DLL найдены правильно. Запуск опции профилирования DependencyWalker на exe хоста дает мне этот соответствующий раздел в журнале:

00:00:55.099: Loaded "mytest.DLL" at address 0x07860000 by thread 0xBBC.  Successfully hooked module.
00:00:55.115: First chance exception 0xC0000139 (DLL Not Found) occurred in "NTDLL.DLL" at address 0x76E24285 by thread 0xBBC.
00:00:55.115: Unloaded "mytest.DLL" at address 0x07860000 by thread 0xBBC.
00:00:55.115: LoadLibraryW("mytest.dll") returned NULL by thread 0xBBC. Error: The specified procedure could not be found (127).

Есть ли способ отладить это, чтобы узнать, что пытается найти сообщение DLL Not Found, о котором сообщает NTDLL.DLL? Или я должен искать источник проблемы в другом месте?

Обратите внимание, что загрузка этого же файла "mytest.DLL" из другого приложения, похоже, работает правильно.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2009

Может ли ваше приложение пытаться вызвать определенную функцию DLL через GetProcAddress после начальной загрузки (возможно), которая не найдена? Это 32 или 64-битное приложение?

Если он правильно загружается в другом приложении, как вы предлагаете, то, вероятно, он имеет правильную точку входа.

Быстрый поиск в Google предполагает, что возвращаемый код ошибки, скорее всего, связан с отсутствующим именем функции (или порядковым значением конкретной функции) в DLL. Я бы предложил открыть DLL-файл в виде Exescope и проверить список экспорта.

Это также может объяснить, почему DLL работает с другим приложением (возможно, другое приложение использует другие экспортированные функции в DLL)?

3 голосов
/ 28 апреля 2009

Использование Process Monitor или FileMon от SysInternals может дать вам подсказку о том, что myTest.dll просто не там, где его ищут.

2 голосов
/ 28 апреля 2009

DependencyWalker показывает неявные зависимости (зависимости, которые автоматически обрабатываются загрузчиком Windows). DLL, которые вы загружаете с помощью LoadLibrary, являются явными зависимостями, и DependencyWalker не может их найти (например, имена библиотек могут быть прочитаны из INI-файла, и DependencyWalker никак не может это определить).

Нет ничего необычного в том, что DLL работает в одном приложении, а не в другом. В наиболее распространенном сценарии у одного приложения уже есть требуемая DLL, а у другого - нет. Если DLL не находится на пути, ваша DLL будет работать в первом случае, а не во втором.

В любом случае, следуйте советам Майкла Берра и используйте FileMon. Несмотря на то, что на веб-сайте SysInternals говорится, что FileMon устарел, его все же намного проще использовать, чем ProcMon.

...