静态库中的对话框资源

Posted

技术标签:

【中文标题】静态库中的对话框资源【英文标题】:Dialog resources in a static library 【发布时间】:2019-10-09 14:13:47 【问题描述】:

我的静态库中的对话框和图标资源有问题。 我用 Visual Studio 2008 创建了一个 MFC 静态库。

我正在从Win32 应用程序调用静态库中的Func(),它试图在静态库中启动一个 MFC 对话框。

当我试图访问资源时,我得到 afxCurrentResourceHandle is NULL 断言。

我在Func() 中添加这一行AFX_MANAGE_STATE(AfxGetStaticModuleState()); 作为第一行。但这没有帮助。

我只需要使用静态库。根据要求,我不应该使用 dll。

请帮助我如何从非 MFC 应用程序启动 MFC 静态库中的对话框。

【问题讨论】:

VC++ resources in a static library的可能重复 @Algirdas 你建议的链接不能解决问题。 OT:这个问题让我觉得离家很近,因为我目前正在修复一个缺陷,这是因为有人将代码移动到静态库(从 .dll),导致在某些对话框中无法显示.. "你建议的链接没有解决问题。"你想要什么解决方案?静态库不能包含嵌入式资源。链接的问题解释说,虽然提供了几种解决方案,但围绕这种限制。 是的,这就是我所看到的问题。请重新阅读重复的建议,以便您了解解决问题的可能方法。正如我已经说过的,它的 TLDR 版本:静态库不能包含资源。 【参考方案1】:

这里的问题是静态库没有“关联的 .res 文件”。如果您尝试将带有资源的 DLL 迁移到静态库,那么您还需要将资源脚本(其 .rc 文件以及任何关联的 .rc2 文件和其他引用资源)“导出”到 客户端程序

因此,就像您在 .cpp 源中拥有 #include "module.h" 行一样,您也需要在程序的主 .rc 文件中(或者,至少在文件中)拥有 #include "module.rc"它包括)。

注意:人们尝试过的其他修复,例如显式链接额外的(预编译的).res 文件将不起作用!尽管二进制.res 文件的内部结构与任何其他.obj 文件非常相似,但链接器只会包含一个!

【讨论】:

如果使用 Visual Studio 资源编辑器,对 .rc 文件手动进行的任何更改都将丢失。因此,请注意通过 Visual Studio 的“资源包含”选项或通过 .rc2 文件包含其他 .rc 文件。 @Nick - 好点!我忘记了这一点,因为我在类似的要包含的资源脚本中/上禁用了可视资源编辑器的使用 - 所有这些都是 .rc2 文件,顺便说一句。

以上是关于静态库中的对话框资源的主要内容,如果未能解决你的问题,请参考以下文章

如何在静态库 (Visual Studio) 中嵌入图标 (.ico)

plist文件无法打包进.a静态库中

静态库中的外部指针为空,当不是静态库时工作正常

gcc找不到静态库中的函数

静态库中的 MagicalRecord:如何加载数据模型?

与静态库中的 std::string 相关的 C++ 未定义符号