我正在尝试制作一个程序,用于在我的程序中存储所选文件(特别是:可执行文件)的内容。问题是我不知道怎么......
我听说您可以通过在程序的单独资源文件中写入内容来完成此操作。
例如:
您有一个可执行文件,并且您希望以关闭C ++程序时可执行文件存在的方式将其存储在您的程序中。你是怎么做到的?
所以如果有人知道如何做到这一点(主要是在C ++程序中编写可执行文件的内容),请通过回答告诉我。
答案 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
};
然后我编译它并将其与最终程序链接。