将完整的应用程序转换为DLL

时间:2011-06-24 12:24:43

标签: c++ windows dll mfc

我有兴趣使用一个完整的MFC应用程序(窗口,菜单,对话框等)应用程序并将其转换为DLL,以便它可以被带入其他可执行文件的虚拟地址空间。

在我投入太多时间之前,我想知道这是否可行,甚至可能。

我不认为CreateProcess会起作用,因为它没有(?)将进程带入与调用者一样的地址空间,就像DLL一样。


我做了一些研究,发现了以下内容:

MSDN上的一个页面,“TN011:使用MFC作为DLL的一部分”,这很有用,但是从你从头开始编写DLL的角度编写。

关于EXE和DLL之间差异的以下引用:

“应用程序可以拥有诸如堆栈,全局内存,文件句柄和消息队列之类的东西,但DLL不能。”


我理解DLL的基础知识,但是大多数DLL都没有提供与完整应用程序相同的功能。

是否足以用创建一个模拟WinMain风格CRT启动的新线程替换DLL CRT启动代码?这个想法必然要求将所有这些启动代码推出真正的DllMain,以避免DLL加载锁定。

我是在正确的轨道上还是有一些与DLL相关的问题会导致这种问题无法维持?

是否有一些简单的方法将exe包装在我不知道的DLL中?

感谢您阅读本文。

2 个答案:

答案 0 :(得分:2)

OP,报告部分成功。

我刚刚使用MFC DllMain而不是试图模仿WinMain风格的启动。我有一些小问题:show window bool为0,GetModule没有按预期工作,但在将它们排序后,程序启动并正常运行。实际上非常棒。

我现在遇到的问题与结束该计划有关。关闭窗口不会像通常那样结束程序,并且它会在之后不久尝试获取消息。 WM_QUIT解决了这个问题。

这是在同步情况下(rundll32等待主循环退出)。当我创建一个线程以异步方式运行程序时,程序使用的许多线程之一很快就会在发送WM_QUIT后崩溃。

就我而言。我不是在征求意见,只是把它放在那里供后代参考。

答案 1 :(得分:1)

  

我有兴趣使用一个完整的MFC应用程序(窗口,菜单,对话框等)应用程序并将其转换为DLL,以便它可以被带入其他可执行文件的虚拟地址空间。

听起来您想重用MVC应用程序中的功能,并将该功能公开为DLL?我不认为你可以把整个东西包装在DLL中,因为这会违反你之前提到的(DLL不处理堆栈,全局内存等)。您是否考虑过将功能移出应用程序并进入DLL?我相信这是其他海报可能暗示的内容。