Да, вам понадобятся 2 отдельных процесса, запущенных из разных исполняемых файлов. Только 32-разрядные исполняемые файлы могут загружать 32-разрядные библиотеки DLL. (См. Ответ @ MichaelPetch для получения полезных советов о том, как заставить одного общаться с другим с помощью механизма удаленного вызова процедур, который может имитировать вызов 32-битных функций из 64-битного кода или наоборот.)
32-разрядная x86 и x86-64 - две отдельные архитектуры, которые, как оказалось, выполняются одним и тем же процессором в разных режимах. Их машинный код очень похож но не совместимы, и многое другое, в том числе формат объектного файла и детали ABI, такие как ширина указателя 8 против 4 байтов.
При наличии 64-битного процесса можно запустить поток , который выполняет jmp far
для 32-битного сегмента кода, технически возможно (потому что GDT имеет 32- и 64-битные записи сегмента кода), но это безумие и очень плохо поддерживается всем, включая код динамической загрузки / разрешения символов DLL. ( Также включает ядро, так что это даже небезопасно: прерывание или системный вызов могут вернуться к 32-битному коду в 64-битном режиме, если вы попытаетесь это сделать, , потому что ядро знает, что ваш поток / процесс запущен в 64-битном режиме.)
Вы не сможете убедить компилятор сгенерировать 32-битный код и связать его с 64-битным кодом, даже если вы использовали C в ОС, где это было «безопасно» для этого. Управляемый язык более высокого уровня делает его еще более непригодным для использования даже в том случае, если он «безопасен» при написании рукописного асма.
Я упоминаю об этом на всякий случай, если вам интересно, что технически потребуется для этого, , а не , потому что кто-то должен это делать.
Но если это было безопасно, теоретически вы могли бы написать (вручную в asm) функции-оболочки для каждой функции в 32-битной DLL, которая переходит в 32-битный режим перед вызовом функции.
Видимо, это было ранним 32-битным Windows; Вы можете вызывать 16-битные библиотеки DLL из 32-битного кода через оболочку «thunk», предоставляемую ОС. Но нет аналогичной поддержки 32-битных DLL из 64-битного кода или наоборот.