我有一个C++ Windows程序。我有一个文本文件,其中包含一些数据。目前,这个文本文件是一个单独的文件,并且在运行时加载和解析。如何将其作为资源嵌入到二进制文件中?
我有一个C++ Windows程序。我有一个文本文件,其中包含一些数据。目前,这个文本文件是一个单独的文件,并且在运行时加载和解析。如何将其作为资源嵌入到二进制文件中?
由于你正在开发一个本地Windows应用程序,你需要创建一个用户定义的资源来嵌入文本文件内容到编译的资源中。
用户定义资源的格式已经在MSDN上进行了文档化,加载它的函数也已经有了相关的文档。
你可以按照以下方式将文本文件嵌入到资源文件中:
nameID typeID filename
其中nameID
是一些唯一的16位无符号整数,用于标识资源,而typeID
是一些大于255的唯一的16位无符号整数,用于标识资源类型(可以在resource.h
文件中定义这些整数)。filename
是指向要嵌入其二进制内容到编译资源中的文件的路径。
因此,你可能会像这样写:
在resource.h
中:
// Other defines...
#define TEXTFILE 256
#define IDR_MYTEXTFILE 101
在你的资源文件中:
#include "resource.h"
// Other resource statements...
IDR_MYTEXTFILE TEXTFILE "mytextfile.txt"
然后你可以像这样加载它(为了清晰起见,省略了错误检查代码):#include <windows.h>
#include <cstdio>
#include "resource.h"
void LoadFileInResource(int name, int type, DWORD& size, const char*& data)
{
HMODULE handle = ::GetModuleHandle(NULL);
HRSRC rc = ::FindResource(handle, MAKEINTRESOURCE(name),
MAKEINTRESOURCE(type));
HGLOBAL rcData = ::LoadResource(handle, rc);
size = ::SizeofResource(handle, rc);
data = static_cast<const char*>(::LockResource(rcData));
}
// Usage example
int main()
{
DWORD size = 0;
const char* data = NULL;
LoadFileInResource(IDR_MYTEXTFILE, TEXTFILE, size, data);
/* Access bytes in data - here's a simple example involving text output*/
// The text stored in the resource might not be NULL terminated.
char* buffer = new char[size+1];
::memcpy(buffer, data, size);
buffer[size] = 0; // NULL terminator
::printf("Contents of text file: %s\n", buffer); // Print as ASCII text
delete[] buffer;
return 0;
}
请注意,你实际上不必释放资源,因为资源位于可执行文件的二进制文件中,当程序退出时系统会自动删除它们(32位和64位 Windows 系统上的函数 FreeResource()
不起作用)。LoadFileInResource()
函数实现将指针存储在一个 const char*
中)。你需要使用 BeginUpdateResource()
、UpdateResource()
和 EndUpdateResource()
函数来进行操作。您可以使用xxd
(来自Linux计算机或可能的Cygwin)生成.h/.cc文件的数据。
有很多关于此详细扩展的堆栈溢出问题: