【问题标题】:Building resources into a DLL for reuse, MFC/VC++将资源构建到 DLL 中以供重用,MFC/VC++
【发布时间】:2009-02-10 08:36:31
【问题描述】:

例如,我想构建一个导出名为 ShowDialog 的函数的 DLL,该函数显示一个对话框并更改其中一个对话框按钮中的文本。对话框和所有其他资源应捆绑在 DLL 中。

我做了一个快速测试,当 DLL 尝试使用某个控件 ID 的 GetDlgItem() 时,它会返回一个空指针。我假设在这种情况下需要更多步骤来正确处理资源。

【问题讨论】:

    标签: visual-c++ dll resources


    【解决方案1】:

    您是否在 DLL 的入口点执行以下操作?

    AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
    

    检查此technote here about MFC module state。 MFC 模块状态有多种类型,模块状态是您最常与之交互的一种。

    这会交换当前模块状态 从返回的状态 AfxGetStaticModuleState 直到结束 当前范围的。

    DLL 中的资源问题将 如果 AFX_MODULE_STATE 宏是 不曾用过。默认情况下,MFC 使用 主资源句柄 加载资源的应用程序 模板。这个模板实际上是 存储在 DLL 中。根本原因是 那个 MFC 的模块状态信息 没有被切换 AFX_MODULE_STATE 宏。资源 句柄从 MFC 的模块中恢复 状态。不切换模块状态 导致错误的资源句柄 用过。

    【讨论】:

    • 谢谢。尽管此回复包含更多信息,但我还是选择了另一个作为正确答案,因为在 DLL 的入口点调用 AFX_MANAGE_STATE 并不能解决问题。
    • 是的。 DLL 的入口点是外部代码可以调用到您的模块中的任何点。我想你以为我的意思是在 DLLMain 或类似的地方
    • 是的,很抱歉造成误解。
    【解决方案2】:

    来自MSDN

    默认情况下,MFC 使用资源 要加载的主应用程序的句柄 资源模板。如果你有一个 DLL 中的导出函数,例如 一个在 DLL,这个模板其实是存储的 在 DLL 模块中。你需要切换 正确的模块状态 要使用的手柄。你可以这样做 将以下代码添加到 函数开头:

    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      相关资源
      最近更新 更多