在本机Windows应用程序中的资源中嵌入文本文件

Oli*_*eng 45 c c++ resources winapi text-files

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

In *_*ico 66

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

用户定义的资源的格式被记录在MSDN,因为是用于装载它的功能.

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

nameID typeID filename
Run Code Online (Sandbox Code Playgroud)

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

所以你可能会这样:

resource.h:

// Other defines...

#define TEXTFILE        256
#define IDR_MYTEXTFILE  101
Run Code Online (Sandbox Code Playgroud)

在您的资源文件中:

#include "resource.h"

// Other resource statements...

IDR_MYTEXTFILE TEXTFILE "mytextfile.txt"
Run Code Online (Sandbox Code Playgroud)

然后你像这样加载它(为清楚起见,省略了错误检查代码):

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

因为数据驻留在可执行二进制文件中,所以不能直接通过检索到的指针对其进行修改(这就是LoadFileInResource()函数实现将指针存储在a中的原因const char*).您需要使用的BeginUpdateResource(),UpdateResource()EndUpdateResource()功能做到这一点.