Преобразование полноценного приложения в DLL - PullRequest
2 голосов
/ 24 июня 2011

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

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

Я не думаю, что CreateProcess будет работать, потому что он не (?) Приводит к процессув том же адресном пространстве, что и вызывающая сторона, как в DLL.


Я провел некоторое исследование и обнаружил следующее:

Страница в MSDN, "TN011: Использование MFC в качествеЧасть DLL ", которая полезна, но написана с точки зрения того, что вы пишете DLL с нуля.

Следующая цитата о различиях между EXE-файлами и DLL:

" Приложениеможет владеть такими вещами, как стек, глобальная память, файловые дескрипторы и очередь сообщений, но библиотека DLL не может. "


Я понимаю основы библиотек DLL, но большинство библиотек DLL не предоставляют такую ​​же функциональностькак полноРаздутые приложения.

Было бы достаточно заменить код запуска DLL CRT чем-то, что создает новый поток, эмулирующий запуск CRT в стиле WinMain?Эта идея обязательно потребует выталкивания всего этого кода запуска из реального DllMain, чтобы избежать блокировок загрузки DLL.

Я на правильном пути или есть какие-то проблемы, связанные с DLL, которые делают это несостоятельным?

Есть ли какой-нибудь простой способ обернуть исполняемый файл в DLL, о которой я не знаю?

Спасибо, что прочитали это.

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

OP здесь, сообщая о частичном успехе.

Я просто использовал MFC DllMain вместо того, чтобы пытаться эмулировать запуск в стиле WinMain.У меня было несколько мелких проблем: bool show window было 0, GetModule не работал должным образом, но после их сортировки программа запускается и работает как обычно.На самом деле довольно удивительно.

Проблемы, которые у меня сейчас возникают, связаны с завершением программы.Закрытие окна не завершает программу, как обычно, и блокируется, пытаясь получить сообщение вскоре после этого.WM_QUIT решает эту проблему.

Это в синхронном случае (rundll32 ожидает выхода из основного цикла).Когда я создаю поток для асинхронного запуска программы, один из множества потоков, в которых программа использует сбои, вскоре после отправки WM_QUIT.

Насколько я понял.Я не прошу совета, просто выкладываю это для будущих поколений.

1 голос
/ 24 июня 2011

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

Похоже, вы хотите повторно использовать функциональность в своем приложении MVC и выставить эту функциональность в виде DLL? Я не думаю, что вы можете взять все это и обернуть его внутри DLL, так как это нарушит то, что вы упомянули ранее (DLL не обрабатывает стек, глобальную память и т. Д.). Рассматривали ли вы перенос функциональности из приложения в DLL? Я полагаю, что это то, на что намекали другие плакаты.

...