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

Embed Text File in a Resource in a native Windows Application(在本机 Windows 应用程序的资源中嵌入文本文件)
本文介绍了在本机 Windows 应用程序的资源中嵌入文本文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

I have a C++ Windows program. I have a text file that has some data. Currently, the text file is a separate file, and it is loaded at runtime and parsed. How is it possible to embed this into the binary as a resource?

推荐答案

由于您正在开发本机 Windows 应用程序,因此您想要做的是创建一个用户定义的资源,将文本文件的内容嵌入到编译后的资源.

Since you're working on a native Windows application, what you want to do is to create a user-defined resource to embed the contents of the text file into the compiled resource.

用户定义资源的格式是记录在MSDN,加载它的函数.

The format of a user-defined resource is documented on MSDN, as are the functions for loading it.

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

You embed your text file in a resource file like this:

nameID typeID filename

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

where nameID is some unique 16-bit unsigned integer that identifies the resource and typeID is some unique 16-bit unsigned integer greater than 255 that identifies the resource type (you may define those integers in the resource.h file). filename is the path to the file that you want to embed its binary contents into the compiled resource.

所以你可能是这样的:

resource.h中:

// Other defines...

#define TEXTFILE        256
#define IDR_MYTEXTFILE  101

在您的资源文件中:

#include "resource.h"

// Other resource statements...

IDR_MYTEXTFILE TEXTFILE "mytextfile.txt"

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

Then you load it like this (error-checking code omitted for clarity):

#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
", buffer); // Print as ASCII text
    delete[] buffer;
    return 0;
}

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

Note that you don't actually have to free the resource since the resource resides in the binary of the executable and the system will delete them automatically when the program exits (the function FreeResource() does nothing on 32-bit and 64-bit Windows systems).

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

Because the data resides in the executable binary, you can't modify it via the retrieved pointer directly (that's why the LoadFileInResource() function implementation stores the pointer in a const char*). You need to use the BeginUpdateResource(), UpdateResource(), and EndUpdateResource() functions to do that.

这篇关于在本机 Windows 应用程序的资源中嵌入文本文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

Prevent class inheritance in C++(防止 C++ 中的类继承)
Why should I declare a virtual destructor for an abstract class in C++?(为什么要在 C++ 中为抽象类声明虚拟析构函数?)
Why is Default constructor called in virtual inheritance?(为什么在虚拟继承中调用默认构造函数?)
C++ cast to derived class(C++ 转换为派生类)
C++ virtual function return type(C++虚函数返回类型)
Is there any real risk to deriving from the C++ STL containers?(从 C++ STL 容器派生是否有任何真正的风险?)