c++ - 在 native Windows 应用程序的资源中嵌入文本文件

标签 c++ c winapi resources text-files

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

最佳答案

由于您正在处理 native Windows 应用程序,因此您想要做的是创建一个用户定义的资源以将文本文件的内容嵌入到已编译的资源中。

用户自定义资源的格式为documented on MSDN , 和 the functions for loading it 一样.

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

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;
}

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

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

关于c++ - 在 native Windows 应用程序的资源中嵌入文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29113250/

相关文章:

c - 如何通过执行 exec 终止正在运行另一个程序的子进程

在 C 中将无符号长整型转换为 64 位有符号长整型

c++ - 如何使子部件独立?

c++ - 使用 c++/QT creator 在另一个类中设置和获取单例变量

c - 如何用 Bison 返回函数名?

c++ - OpenGL - 使用变换矩阵确定平面上的投影

c# - 连接到远程共享文件夹导致 "multiple connections not allowed"错误,但尝试断开连接导致 "connection does not exist"

c++ - 如何从Winapi中的“编辑”表单获取文本?

c++ - Boost (v1.33.1) 线程中断

c++ - 想要构建一些必要的库来进行特征检测。有一些错误