在本机Windows应用程序的资源中嵌入文本文件 我有一个C++的Windows程序。我有一个包含一些数据的文本文件。目前,文本文件是一个单独的文件,它在运行时加载并解析。如何将其作为资源嵌入到二进制文件中?

在本机Windows应用程序的资源中嵌入文本文件 我有一个C++的Windows程序。我有一个包含一些数据的文本文件。目前,文本文件是一个单独的文件,它在运行时加载并解析。如何将其作为资源嵌入到二进制文件中?,c++,c,winapi,resources,text-files,C++,C,Winapi,Resources,Text Files,您可以使用xxd(从linux机器或可能是cygwin)为.h/.cc文件生成数据 有很多关于堆栈溢出的问题需要详细讨论: 由于您使用的是本机Windows应用程序,因此您需要创建一个用户定义的资源,将文本文件的内容嵌入到已编译的资源中 用户定义资源的格式如下所示 将文本文件嵌入到资源文件中,如下所示: nameID typeID filename 其中,nameID是标识资源的唯一16位无符号整数,typeID是标识资源类型的大于255的唯一16位无符号整数(您可以在resource.

您可以使用
xxd
(从linux机器或可能是cygwin)为.h/.cc文件生成数据

有很多关于堆栈溢出的问题需要详细讨论:


由于您使用的是本机Windows应用程序,因此您需要创建一个用户定义的资源,将文本文件的内容嵌入到已编译的资源中

用户定义资源的格式如下所示

将文本文件嵌入到资源文件中,如下所示:

nameID typeID filename
其中,
nameID
是标识资源的唯一16位无符号整数,
typeID
是标识资源类型的大于255的唯一16位无符号整数(您可以在
resource.h
文件中定义这些整数)
filename
是要将其二进制内容嵌入已编译资源的文件的路径

所以你可以这样做:

nameID typeID filename
资源.h
中:

// Other defines...

#define TEXTFILE        256
#define IDR_MYTEXTFILE  101
在资源文件中:

#include "resource.h"

// Other resource statements...

IDR_MYTEXTFILE TEXTFILE "mytextfile.txt"
然后按如下方式加载(为了清楚起见,省略了错误检查代码):

#包括
#包括
#包括“resource.h”
void LoadFileInResource(整数名称、整数类型、DWORD和大小、常量字符*&数据)
{
hmodulehandle=::GetModuleHandle(NULL);
HRSRC rc=::FindResource(句柄,MAKEINTRESOURCE(名称),
MAKEINTRESOURCE(类型));
HGLOBAL rcData=::LoadResource(句柄,rc);
大小=::SizeofResource(句柄,rc);
数据=静态_cast(::锁资源(rcData));
}
//用法示例
int main()
{
DWORD大小=0;
常量字符*数据=NULL;
LoadFileInResource(IDR_MYTEXTFILE,TEXTFILE,大小,数据);
/*访问数据中的字节-下面是一个涉及文本输出的简单示例*/
//存储在资源中的文本不能以NULL结尾。
字符*缓冲区=新字符[大小+1];
::memcpy(缓冲区、数据、大小);
缓冲区[size]=0;//空终止符
::printf(“文本文件的内容:%s\n”,缓冲区);//作为ASCII文本打印
删除[]缓冲区;
返回0;
}

请注意,实际上不必释放资源,因为资源驻留在可执行文件的二进制文件中,当程序退出时,系统将自动删除它们(函数
FreeResource()
在32位和64位Windows系统上不执行任何操作)


由于数据驻留在可执行二进制文件中,因此不能直接通过检索到的指针对其进行修改(这就是
LoadFileInResource()
函数实现将指针存储在
const char*
中的原因)。您需要使用
BeginUpdateResource()
UpdateResource()
EndUpdateResource()
函数来完成此操作。

-1 PE(+)文件已经能够存储自定义资源,Windows构建工具拥有您所需的一切。资源脚本语法已记录在案,操作系统提供了访问该数据的API。这个答案是对另一个问题的回答。我还有一个问题要问。你能回答我的第二个与你的答案有关的问题吗?如何使dll文件具有包含答案中主要代码的功能。“程序退出时系统将自动删除它们”退出系统时不是所有程序都有可用资源吗?内存泄漏和资源泄漏发生在可执行文件的执行过程中。因此,如果这个程序加载n个相同的资源,它将在资源泄漏中发出。在资源文件的属性中有“Null Terminate Strings”,我有一个win32应用程序。我可以知道在哪里可以找到资源文件以及如何创建用户定义的资源文件吗?我想在构建过程中加载一个xml文件。文件大小为20MB。