Ошибка выполнения (загрузка dll) с приложениями win32 в системе x64 при компиляции 0K

Первоначально я разработал приложение win32 на 32-битной версии win7 с VC9.0. Недавно я обновился до 64-разрядной версии Win7 и попытался собрать + выполнить предыдущее приложение.

Сборка работает нормально (приложение win32), но во время выполнения я получаю сообщение об ошибке «[...] завершил работу с кодом -1073741701 (0xc000007b)».

Я предполагаю, что это результат загрузки 64-битной версии [предполагаемой] 32-битной dll.

Конкретные зависимости для этого проекта: SDL.lib SDLmain.lib SDL_ttf.lib opengl32.lib glu32.lib wininet.lib

SDL и SDL_ttf только в 32-битной версии. Я предполагаю, что Visual Studio достаточно умен, чтобы получить файлы opengl и glu lib в \syswow64, когда я запрашиваю приложение win32.

Может ли это быть из-за виннета? Или я ошибся?

Спасибо,


person ibanez    schedule 21.03.2011    source источник
comment
Вы догадались? Так вы на самом деле не пробовали его отлаживать? Вы хотя бы проверили это с помощью Dependency Walker?   -  person Neil    schedule 21.03.2011
comment
Это STATUS_INVALID_IMAGE_FORMAT, вы не можете загрузить 32-разрядную DLL в 64-разрядный процесс. Кошки и собаки.   -  person Hans Passant    schedule 21.03.2011
comment
Действительно, это было предположение. Я совсем новичок и не знаком с такими вопросами. Кошки и собаки, эффективно.   -  person ibanez    schedule 22.03.2011


Ответы (1)


Похоже, вы загружаете 64-битную DLL в 32-битный процесс или наоборот. Вот как я могу отследить нарушающую DLL.

Первый шаг — запустить dumpbin.exe (используйте командную строку VS, чтобы получить его в PATH) в исполняемом файле, чтобы убедиться, что архитектура соответствует вашим ожиданиям: dumpbin.exe /headers foo.exe. В выводе заголовка файла вы должны увидеть значение «машина» «x86» или «x64». В необязательном выводе заголовка вы должны увидеть волшебство «PE32» (для x86) или «PE32+» (для x64).

Следующим шагом является запуск соответствующего средства обхода зависимостей, доступного по адресу www.dependencywalker.com, в зависимости от архитектуры (x86 или x64) исполняемый. Этот инструмент должен сообщать вам, если он обнаруживает зависимость от путей поиска, которые не относятся к той же архитектуре.

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

person Peter Huene    schedule 21.03.2011
comment
Спасибо за способ отслеживания. Dumpbin сообщает машинное значение x86 и магию PE32. Средство обхода зависимостей сообщает, что ZLIB1.dll для архитектуры x64 загружена. Почему? Честно говоря, я даже не знаю, для чего эта dll. Может быть, вы могли бы пролить свет на это? Спасибо. - person ibanez; 22.03.2011
comment
Я забыл, ZLIB1.dll (x64) запрашивается LIBFREETYPE-6.dll (x86), в соответствии с тем, что я вижу [и понимаю] в Dependency Walker. - person ibanez; 22.03.2011
comment
Где в настоящее время установлена ​​zlib1.dll? Попробуйте заменить его на 32-битную версию и посмотрите, решит ли это вашу проблему. - person Peter Huene; 22.03.2011
comment
Это было в ProgramFiles/Intel/Wifi/bin. Очевидно, замена его на 32-битную версию помогла. А вот хотелось бы узнать, зачем эту dll просили! В любом случае, по крайней мере, Dependency Walker указал на виновника. Тогда спасибо! - person ibanez; 25.03.2011
comment
Я предполагаю, что это просто нормальная зависимость чего-то, от чего зависит ваше приложение. Установщик, вероятно, изменил PATH, чтобы указать на этот каталог (%ProgramFiles% для 64-разрядного программного обеспечения; %ProgramFiles(x86)% для 32-разрядного программного обеспечения), и вы случайно выбрали 64-разрядную версию. Вероятно, вы не захотите заменять эту библиотеку 32-разрядной версией, так как она, скорее всего, сломает что-то, что от нее зависит. Вместо этого я бы просто скопировал 32-битную версию локально в ваше приложение. Не о чем беспокоиться. - person Peter Huene; 25.03.2011
comment
Спасибо за информацию. Я скопировал его локально, это действительно самое безопасное. - person ibanez; 26.03.2011