如何在应用程序中嵌入数据

时间:2010-08-15 20:02:46

标签: c++ visual-c++ cross-platform wxwidgets cross-compiling

我想创建一个应用程序,但应用程序将使用图标(位图)来处理某些菜单按钮和其他内容。我想将我的应用程序保存为一个简单的单独的exe文件,这意味着我将以某种方式将所有图标嵌入到应用程序中(Windows上的EXE),这样我就可以加载位图而无需任何外部文件。

有谁知道我该怎么做?

其他一些信息: 我正在使用wxWidgets,目前使用的是MSVC,如果可能的话,我更喜欢使用跨编译器/跨平台的方法。

提前致谢!

4 个答案:

答案 0 :(得分:6)

您可以将XPM格式用于您的位图,因为它很容易嵌入到您的代码中(当然这将在exe中,在您想要的地方;-)。正如the docs所说,

  

所有wxWidgets平台都支持XPM   用于小位图和图标。你可以   包括XPM内联,如下所示   它是C代码,或者您可以加载它   运行时

(“如下所示”是#include指令) - 因此,通过采用“include”选项采用这种方法,您将完全是交叉编译器和跨平台。

有关XPM格式的详细信息,请参阅here。当然,很容易从其他流行格式中找到转换为XPM的转换器。

答案 1 :(得分:1)

Windows确实有资源文件。您可以使用它。或者,您可以编写一个小实用程序,将您的二进制图标转换为C常量数组

例如:

const unsigned int my_icon[] = {0x12345678, 0x87654321, .... };

这可以在perl中轻松完成,然后您可以使用变量my_icon访问该图标。

答案 2 :(得分:0)

因为Linux没有平台解决方案,所以无论如何都必须创建自己的系统。因此,我建议针对平台特定的方法在Windows和macosx上添加资源。

你可以使用FOX GUI Toolkit附带的reswrap是一个简单的工具,可以将任何二进制文件转换为c char文字。如果使用msvc进行编译,很快就会发现包含大量字符串的大型文件对编译器是有害的。我为我的项目添加了大约900个图标,它杀死了编译器。

我目前正在使用一个解决方案,我只需在可执行文件的末尾复制二进制存档。今天的每个平台都可以为您提供可执行路径,如果在可执行文件的末尾添加了额外的数据,则ELF,EXE或Mach-O文件都不关心。

答案 3 :(得分:0)

我们在项目中使用这种技术:

  1. 使用optipng ./image.png优化您的png文件。
  2. 使用png2wx Perl脚本将二进制图像数据转换为文本。
  3. 以这种方式将您的图片嵌入到源代码中:
    
    {
        wxMemoryInputStream sm("\211PNG\r\n\032\n\000\000....", 116);
        m_bitmap = wxBitmap( wxImage(sm) );
    }
  4. 不要忘记在wxApp::OnInit()函数中添加对PNG格式的支持:

    wxImage::AddHandler(new wxPNGHandler);
    

    Here是原始教程的链接。

    希望这会有所帮助!