У меня есть программа для Windows на C ++. У меня есть текстовый файл с данными. В настоящее время текстовый файл представляет собой отдельный файл, который загружается во время выполнения и анализируется. Как можно встроить это в двоичный файл в качестве ресурса?
Внедрить текстовый файл в ресурс в собственном приложении Windows
Ответы (2)
Поскольку вы работаете над собственным приложением Windows, вам нужно создать определяемый пользователем ресурс для встраивания содержимого текстового файла в скомпилированный ресурс.
Формат определяемого пользователем ресурса задокументирован в MSDN, как и функции для загружая его.
Вы вставляете свой текстовый файл в файл ресурсов следующим образом:
nameID typeID filename
где nameID
- это некое уникальное 16-битовое целое число без знака, которое идентифицирует ресурс, а typeID
- некоторое уникальное 16-битовое целое число без знака больше 255, которое определяет тип ресурса (вы можете определить эти целые числа в файле resource.h
). filename
- это путь к файлу, двоичное содержимое которого вы хотите встроить в скомпилированный ресурс.
Итак, у вас может быть это так:
In 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()
.
Вы можете использовать xxd
(с Linux-машины или, возможно, cygwin) для генерации данных для файла .h / .cc.
Есть много вопросов о переполнении стека, которые подробно раскрывают это:
- Как передать содержимое файла во время сборки в строку c
- «#include» текстовый файл в программе C как символ []