c ++在程序中编写文件内容

时间:2012-01-26 11:27:58

标签: c++ file resources executable

我正在尝试制作一个程序,用于在我的程序中存储所选文件(特别是:可执行文件)的内容。问题是我不知道怎么......

我听说您可以通过在程序的单独资源文件中写入内容来完成此操作。

例如:

您有一个可执行文件,并且您希望以关闭C ++程序时可执行文件存在的方式将其存储在您的程序中。你是怎么做到的?

所以如果有人知道如何做到这一点(主要是在C ++程序中编写可执行文件的内容),请通过回答告诉我。

2 个答案:

答案 0 :(得分:3)

如果您使用的是Microsoft Visual Studio,那么它非常简单: 在“添加资源”对话框中单击“导入”,选择“所有文件()”,以便它允许您导入可执行文件,然后只需选择所需的文件即可。弹出“自定义资源类型”对话框时,在“资源类型”字段中键入RCDATA。

如果你打开.rc文件,你会看到如下内容:

/////////////////////////////////////////////////////////////////////////////
//
// RCDATA
//

IDR_RCDATA1          RCDATA               "myexecutable.exe"

它将生成resource.h,其中包含以下行:

#define IDR_RCDATA1                  101

在代码中,您可以像这样访问它:

#include "resource.h"
#include <windows.h>

int main(int argc, char* argv[])
{
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
    void* pMyExecutable = ::LockResource(myResourceData);
    return 0;
}

其中pMyExecutable是指向此可执行文件的第一个字节的指针。如何检索此资源的大小或您将在此处找到的其他有用信息:
http://msdn.microsoft.com/en-us/library/ff468902(v=vs.85).aspx

...这是一个如何在磁盘上保存二进制资源的示例:

#include "resource.h"
#include <windows.h>
#include <fstream>

int main(int argc, char* argv[])
{
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    unsigned int myResourceSize = ::SizeofResource(NULL, myResource);
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
    void* pMyExecutable = ::LockResource(myResourceData);

    std::ofstream f("C:\\x.exe", std::ios::out | std::ios::binary);
    f.write((char*)pMyExecutable, myResourceSize);
    f.close();

    return 0;
}

使用这样的资源构建项目时,此资源将成为“程序”(.exe,.dll,...)的一部分。

希望这可以帮助你;)

答案 1 :(得分:1)

程序资源是Microsoft特定的增强功能;使用它们 直接将使您的代码不可移植(可能是也可能不是 问题)。我经常使用的另一种方法是写一个小的 “预处理器”将resorces转换为C ++源代码,我 然后编译。例如,如果外部文件只是文本,我可能会 写一些东西来转换它:

first line
second line 
third line

char const* name[] =
{
    "first line",
    "second line ",
    "third line",
    NULL
};

然后我编译它并将其与最终程序链接。