【问题标题】:Converting a full-blown application to a DLL将成熟的应用程序转换为 DLL
【发布时间】:2011-09-22 00:05:23
【问题描述】:

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

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

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


我做了一些研究,发现如下:

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

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

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


我了解 DLL 的基础知识,但大多数 DLL 不提供与成熟应用程序相同的功能。

将 DLL CRT 启动代码替换为创建一个模拟 WinMain 样式 CRT 启动的新线程就足够了吗?这个想法必然需要将所有这些启动代码从真正的 DllMain 中推出,以避免 DLL 加载锁定。

我是否走在正确的轨道上,或者是否存在一些与 DLL 相关的问题导致这种情况站不住脚?

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

感谢您阅读本文。

【问题讨论】:

  • 您实际上想通过这样做来完成什么?您只想在另一个应用程序中使用此 DLL 中的资源吗?
  • 您希望新应用程序调用此 DLL 中的函数吗?还是您希望新应用程序加载 DLL 并启动旧应用程序?如果是后者,那么一个过程听起来像你想要的吗?
  • 基本上,我想公开应用程序的代码/数据并允许外部控制/修改应用程序的数据,而不必丢弃大量代码并进行重大重写。保留原始 UI 内容也是有益的。我可能最终不得不尝试另一种解决方案,但我想看看这是否可行。

标签: c++ windows dll mfc


【解决方案1】:

在这里,报告部分成功。

我只是使用了 MFC DllMain,而不是尝试模拟 WinMain 风格的启动。我遇到了一些小问题:show window bool 为 0,GetModule 没有按预期工作,但在将它们整理出来后,程序正常启动并运行。实际上,相当惊人。

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 对,那是 B 计划。问题是,它是一个相当老的(约 2001 年)应用程序,不是我编写的,所以砍掉 UI 来获得我需要的东西会很头疼,并使得验证原始应用程序变得更加困难。但是,如果没有人能想出办法做到这一点,那么这就是我必须做的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2012-11-02
    • 2010-12-06
    • 2011-11-24
    • 2011-10-10
    • 2010-09-05
    相关资源
    最近更新 更多