Подтвердить что ты не робот

Вставить текстовый файл в ресурс в собственном приложении Windows

У меня есть программа на С++ Windows. У меня есть текстовый файл с некоторыми данными. В настоящее время текстовый файл представляет собой отдельный файл, и он загружается во время выполнения и анализируется. Как можно вставить это в двоичный файл как ресурс?

4b9b3361

Ответ 1

Поскольку вы работаете с родным приложением Windows, вы должны создать пользовательский ресурс для встраивания содержимого текстового файла в скомпилированный ресурс.

Формат определяемого пользователем ресурса документируется в MSDN, а также функции его загрузки.

Вы вставляете свой текстовый файл в файл ресурса следующим образом:

nameID typeID filename

где nameID - это уникальное 16-разрядное целое число без знака, которое идентифицирует ресурс, а typeID - это уникальное 16-разрядное целое число без знака больше 255, которое идентифицирует тип ресурса (вы можете определить эти целые числа в файле 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 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().

Ответ 2

Вы можете использовать xxd (от Linux-машины или, возможно, cygwin) для генерации данных для файла .h/.cc.

Существует множество вопросов, которые подробно описываются ниже: