2013-11-07 3 views
0

Чтобы описать проблемы у меня были бы слишком долго, но проблема на острый конец является:LoadLibraryW возвращается nullptr и GetLastError() возвращает 3221225619

  1. LoadLibraryW терпит неудачу (возвращает nullptr) когда задан допустимый путь.

  2. Монитор процесса не регистрирует никаких подозрительных сбоев или, действительно, ничего отличного от того, когда ему удастся загрузить DLL (что может быть в другом контексте).

  3. У dll нет несистемных зависимостей.

  4. ... и хуже всего, код ошибки Windows, возвращаемый GetLastError является 3221225619.

Предполагая, что 3221225619 не является допустимым кодом ошибки, что может идти так неправильно, что Windows, Безразлично» t даже имеет код ошибки для этого?

EDIT:

Я думаю, что некоторые люди хотели более подробной информации о самой недостаточности:

  • Это не кажется, вход - он идентичен в рабочем и неисправную версии, и LoadLibraryW успешно объявила, что «файл не существует», когда входная строка искалечена. Текущий вход имеет жестко закодированный вход, оставляя мало места для ошибки.
  • dll скомпилирован в Release и код вызова в Debug. Я делаю это в течение 18 месяцев без проблем, но вы никогда не знаете.
  • Пакет Process Monitor сообщает о 30 внутренних операциях, выполняемых в LoadLibraryW, включая CreateFile, LoadImage, RegOpenKey. Это идентичные для рабочего вызова и отказающего вызова, вплоть до размеров файлов и мест памяти.
  • Нет очевидного повреждения памяти в объекте C++, вызывающем его, и, как я уже сказал, Process Monitor предоставляет одинаковый адрес базового изображения в обоих случаях.
  • Несостоятельность 100% соответствует - в то же время, в том же месте каждый раз.
+0

Что вы имеете на DllMain загружаемой библиотеки? –

+0

Я просто вызываю его из исполняемого файла напрямую. –

+0

Вы закодировали соответствующую DLL? –

ответ

0

Извините, это не ровно ответ, но проблема решена.

Для начала я заметил здесь аналогичный вопрос: C++ Loadlibrary() error 3765269347. Я думаю, что это дает более подробную информацию, и стоит посмотреть, если вы находитесь в той же позиции, что и я.

Благодарю @WhozCraig, @DanielDaranas и всех, кто сделал полезные комментарии. Для других людей, читающих это, есть хорошая статья о HRESULT, которая расширяет их точки в Википедии: http://en.wikipedia.org/wiki/HRESULT.

В моем случае проблема исчезла так же загадочно, как и возникла. Я создал класс C++ для вызова DLL на регулярной основе. Мое первоначальное усилие загрузило dll непосредственно перед первым вызовом и кэшировало его в памяти. В принципе, это то же самое, что и в течение года. Это привело к таинственной ошибке выше.

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

Смежные вопросы