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

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

45
задан Oliver Zheng 29 May 2010 в 00:42
поделиться

2 ответа

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

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

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

nameID typeID filename

где nameID - это уникальное 16-битное целое число без знака, которое идентифицирует ресурс, а typeID - какое-то уникальное 16 -битовое целое число без знака больше 255, которое определяет тип ресурса (вы можете определить эти целые числа в файле resource.h ). имя_файла - это путь к файлу, двоичное содержимое которого вы хотите встроить в скомпилированный ресурс.

Таким образом, у вас может быть это так:

В 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 () .

66
ответ дан 26 November 2019 в 21:23
поделиться

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

Есть много вопросов о переполнении стека, которые подробно раскрывают это:

-2
ответ дан 26 November 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: