LoadLibraryw возвращает Nullptr, а GetlasterRor () возвращает 3221225619

StackOverflow https://stackoverflow.com/questions/19834543

  •  25-07-2022
  •  | 
  •  

Вопрос

Чтобы описать проблемы, с которыми я сталкивался, займет слишком много времени, но проблема на резком конце:

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

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

Решение

Извините, это не в яблочко Ответ, но проблема была решена.

Для начала я только что заметил подобный вопрос здесь: C ++ LoadLibrary () ошибка 3765269347. Анкет Я думаю, что это дает больше деталей, и стоит посмотреть, если вы в том же положении, в чем я.

Я благодарю @whozcraig, @danieldaranas и всем остальным, кто сделал полезные комментарии. Для других людей, читающих это, есть хорошая статья о HResult, которая расширяется на их точки на Википедии: http://en.wikipedia.org/wiki/hresult.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top