2010-02-15 2 views
28

Есть ли способ загрузить 32-битную библиотеку DLL (что-то с тем же использованием, что и LoadLibrary). Я хотел бы использовать эту функцию вместе с GetProcAddress.Загрузить 32-битную библиотеку DLL в 64-битном приложении

Я посмотрел на WOW, но, похоже, он не предлагает функциональность. Функциональность должна существовать, поскольку такие инструменты, как DependencyWalker, могут читать символы 32-разрядной библиотеки DLL, даже несмотря на то, что ее 64 бита.

благодаря

+0

Ответ на этот вопрос: http://stackoverflow.com/questions/128445/calling-32bit-code-from-64bit-process. Ответ Джона Кноуэра ниже также верен. –

+0

https://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/ – Ampere

+0

@John B. Lambe Название этого сообщения яснее, чем у вас связанный для тех, кто ищет объект exe-call-dll. – ebk

ответ

40

К сожалению, вы можете загружать 32-разрядную DLL только в 64-разрядный процесс, когда вы загружаете dll в качестве файла данных. Вы не можете выполнить код. http://support.microsoft.com/kb/282423

Корпорация Майкрософт рекомендует использовать межпроцессорный COM для использования 32-разрядного кода с 64-разрядным приложением. Вот статья, объясняющая процесс http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/ Это не весело.

+0

Обновленная ссылка на статью: http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/ См. Также http://stackoverflow.com/questions/128445/вызывающей 32bit-кода из-64-битного-процесса –

2

Там разница между чтением 32-битный исполняемый файл и выполнение кода в 32 битном исполняемого файла. Я не считаю, что Windows предлагает любую функциональность для этого.

Единственный способ, которым вы, вероятно, сможете это сделать, - создать 32-битный процесс, который загружает DLL, а затем выполняет межпроцессную связь для передачи результатов между двумя процессами.

0

Если все, что вы желание сделать это получить ресурсы от него, вы можете загрузить в файл данных:

LoadLibraryEx(exeName, NULL, LOAD_LIBRARY_AS_DATAFILE); 

Затем вызовите FindResource как обычно.