У меня есть Windows-программа C++. У меня есть текстовый файл, который имеет некоторые данные. В настоящее время текстовый файл является отдельным файлом, и он загружается во времени выполнения и анализируется. Как возможно встроить это в двоичный файл как ресурс?
Поскольку вы работаете над собственным приложением 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 ()
.
Вы можете использовать xxd
(с Linux-машины или, возможно, cygwin) для генерации данных для файла .h / .cc.
Есть много вопросов о переполнении стека, которые подробно раскрывают это: