У меня есть программа на С++ Windows. У меня есть текстовый файл с некоторыми данными. В настоящее время текстовый файл представляет собой отдельный файл, и он загружается во время выполнения и анализируется. Как можно вставить это в двоичный файл как ресурс?
Вставить текстовый файл в ресурс в собственном приложении Windows
Ответ 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.
Существует множество вопросов, которые подробно описываются ниже: