class - 将资源嵌入可重用 MFC 类的正确方法是什么?

标签 class mfc resource-files

我正在编写一个 C++(特别是 MFC)类,它使用外部 .gif 图像文件,并在经过一些处理后生成另一个图像文件。如果初始图像能够以某种方式嵌入到代码中,那就太好了。我在 MSDN 中读到过有关使用多个 .rc 文件的内容,整个事情看起来相当复杂。

我想请教曾经经历过此问题的人如何处理这个问题。

编辑:抱歉我不清楚。我正在编写的类应该是独立的,所以我可以再次使用它。如果我将图像放入资源文件中,那么如果在新项目中使用该类,则该类将无法编译。

最佳答案

您不能将 MFC 资源嵌入到类或类似的 C++ 容器中。它们只能嵌入到 DLL 或 EXE 文件中 - 在生成的二进制文件的单独部分中。由于您希望您的类可重用,因此必须将其放入 DLL 中。因此,您必须使用 AFX_EXT_CLASS 标记您的类(class)。关键字。

有两种解决方案。

解决方案#1:

  • 创建 MFC DLL 项目(MFC 扩展 DLL)。将其命名为 MyLibrary 或其他名称。
  • 将所有独立类放入此 DLL 中。
  • 嵌入所有必要的资源。
  • 让您的类从 DLL 的 HINSTANCE 加载资源,如下所述。

有多种方法可以检索 DLL 的 HINSTANCE。如果你问我,最好的解决方案是在 DllMain 中获取它。如果您选择 MFC Extension DLL 配置,此操作会自动完成:

static AFX_EXTENSION_MODULE MyLibDLL = { NULL, NULL }; // Make this variable global!
// Then access the hInstance as follows:
LoadResource(MyLibDLL.hModule, ...)

解决方案#2:

将资源存储为字节缓冲区。或者更好,将其转换为 Base64并将其存储为 ASCII 字符串。但记住不要炸毁堆栈!保持资源较小或增加项目设置中的堆栈大小。示例:

const char *encodedResource = "SGVsbG8gd29ybGQh";
char *data = decode(encodedResource);
foo(data);

关于class - 将资源嵌入可重用 MFC 类的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11751209/

相关文章:

c# - 资源 (.resx) 文件是否存在任何性能问题或注意事项?

c++ - 这怎么可能在 C++ 中使用?

c++ - 在 MFC 窗体中围绕控件创建边框

c++ - 从 'OLE_HANDLE' 转换为 'HICON' 的正确方法是什么?

c++ - 连接资源文件中的字符串并将其传递给菜单项字符串(winapi)c++

c# - 不可访问的内部资源文件?

javascript - 确定 JavaScript 类中的问题范围

c++ - 了解 C++ 中的模板类 - new-operator 的问题

ruby - `Module#singleton_class` 的倒数

c++ - 为什么 RUMTIME_CLASS 在 VS2008 Debug 版本中没有 "DECLARE_DYNAMIC"通过编译?