Загрузить 32-битную библиотеку DLL в 64-битное приложение
Есть ли способ загрузить 32-битную библиотеку DLL (что-то такое же использование, как LoadLibrary), я хотел бы использовать эту функцию вместе с GetProcAddress.
Я посмотрел на WOW, но, похоже, не предлагает функциональность. Функциональность должна существовать, так как такие инструменты, как DependencyWalker, способны читать символы 32-битной библиотеки DLL, даже если она 64-битная.
Спасибо
4 ответа
Извините, но вы можете загрузить 32-битную DLL в 64-битный процесс только тогда, когда вы загружаете dll как файл данных. Вы не можете выполнить код. http://support.microsoft.com/kb/282423
Microsoft рекомендует использовать межпроцессный COM для использования 32-битного кода с 64-битным приложением. Вот статья, объясняющая процесс http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/ Это не весело.
Если все, что вы хотите сделать, это получить от него ресурсы, вы можете загрузить их как файл данных:
LoadLibraryEx(exeName, NULL, LOAD_LIBRARY_AS_DATAFILE);
Тогда позвони FindResource
как обычно.
Существует разница между чтением 32-битного исполняемого файла и выполнением кода в 32-битном исполняемом файле. Я не верю, что Windows предлагает какую-либо функциональность для этого.
Единственный способ, которым вы, вероятно, сможете это сделать, - это создать 32-битный процесс, который загружает DLL, а затем выполняет межпроцессное взаимодействие для передачи результатов между двумя процессами.
Теоретически да. Я реализовал способ. ЦП позволяет это, ОС - нет, но есть обходной путь.
Он основан на перескакивании сегмента совместимости с длинным режимом. В x64 есть «64-битные» сегменты, выполняющие 64-битный код, и сегменты «совместимости», выполняющие 32-битный код. Хотя содержащая его структура GDT доступна только в режиме ядра, в Windows есть предварительно загруженный сегмент 0x23, к которому можно перейти, если вы знаете, как это сделать.
Вам также необходимо исправить таблицу импорта, но не с помощью обычного GetProcAddress и т. д., поскольку эта функция будет возвращать 64-битные указатели (поскольку вы используете приложение x64), в то время как вам нужно исправить 32-битную загруженную библиотеку.
Код здесь демонстрирует всю эту теорию. В статье «Мой проект кода» это подробно объясняется, а в моем общем руководстве по сборке Intel описываются внутренние компоненты x64. В коде по ссылке выше я создаю 32-битную DLL и загружаю ее в процесс x64.
На практике он пока не работает с Win32 Dll, и даже если он когда-нибудь заработает, я бы не стал использовать его в рабочем коде. Я все еще работаю в нем.
Однако библиотеки x86 теперь мертвы. Например, когда я изначально создавал свой аудиосеквенсор, существовало множество плагинов только для x86, из которых теперь почти все поставляется (возможно, исключительно) как x64.
Сейчас это просто для экспериментов.