【问题标题】:How to load resource from exe rather than dll如何从exe而不是dll加载资源
【发布时间】:2012-03-14 06:33:56
【问题描述】:

我正在加载一个包含语言资源的附属 dll。但是我只想将字符串存储在 dll 中,而不是对话框资源中。我加载 dll 如下:

hInst = LoadLibrary( _T("MyAppFRA.dll") );
if (hInst!= NULL)
    AfxSetResourceHandle( hInst );

问题是如果我现在如下所示带一个 CTestDlg,它永远不会出现。

CTestDlg dlg;
dlg.DoModal()

这是因为对话框资源 IDD_DIALOG1 在 exe 中但不在 dll 中,所以 DoModal() 似乎找不到它(由于AfxSetResourceHandle() 调用。)这是故意的,我想如果它没有在 dll 中找到资源,它会自动在 exe 中查找,但似乎并非如此。

当我的其余资源在 dll 中时,我可以从 exe 资源加载对话框吗?

【问题讨论】:

  • 您的对话框是否不包含任何文本?为什么不翻译呢?
  • @MarkRansom 他们这样做了,我想从 OnInitDialog() 中的当前资源句柄加载文本。这样我的对话资源是共享的,只有文本被翻译。
  • 有时布局需要改变,因为单词比英文长或短。但如果它对你有用,我不会抱怨。

标签: dll mfc


【解决方案1】:

我们有一个庞大的应用程序,资源遍布各处。每当您想要更改 MFC 查找资源的上下文时,都可以使用 AfxSetResourceHandle()。我们有一个基于堆栈的对象,它允许我们设置资源句柄然后恢复它。 AfxGetResourceHandle() 是获取当前值的函数。

【讨论】:

  • 如果您愿意在 OnInitDialog 中调用 AfxSetResourceHandle,则此方法有效。
  • @MarkRansom 这意味着我必须来回更改上下文,这将是很多很多地方,有点不受欢迎。我去了this,微软说“如果 MFC 没有找到任何附属 DLL,它会使用应用程序本身包含的任何资源。”但我想重点是“找不到卫星 dll”而不是“dll 中的资源”,所以我的解释是错误的。
  • 好吧,我已经重新阅读了您的原始问题...我看到您正在使用 LoadLibrary() 手动加载 DLL。 AfxSetResourceHandle() 东西被设计用于 MFC 扩展库。您是否将 DLL 构建为扩展库?这将对 MFC 遍历 DLL 资源的方式产生影响。如果将 DLL 设置为扩展库,资源的最大问题不是找不到资源,而是重复。如果你没有任何资源的重复,你永远不必担心调用 AfxSetResourceHandle(),因为 MFC 应该会发现一切都很好
  • @JoeWillcoxson 是的,它是一个扩展 dll,但它没有找到资源。
  • 好吧,下一步我将在 Visual Studio 中打开可执行文件/DLL 作为资源。然后,我会检查该编译模块中的资源,以确保该资源确实存在。
【解决方案2】:

您可以自己从 .exe 资源中加载对话框模板,然后调用InitModalIndirect 将其绑定到对话框对象。 DoModal 将使用此资源,而不是尝试从当前资源句柄中加载一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2016-12-22
    • 2017-06-07
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多