c ++ записывает содержимое файла в программу - PullRequest
2 голосов
/ 26 января 2012

Я пытаюсь создать программу, которая хранит содержимое выбранного файла (в частности: исполняемого файла) в моей программе.Проблема в том, что я не знаю, как ...

Я слышал, что это можно сделать, записав содержимое в отдельный файл ресурсов программы.

Например:

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

Итак, если кто-нибудь знает, как это сделать (главным образом, содержимое исполняемого файла в программе на C ++), пожалуйста, дайте мне знать, ответив здесь.

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Если вы используете Microsoft Visual Studio, то это довольно просто: В диалоговом окне «Добавить ресурс» нажмите «Импорт», выберите «Все файлы (. )», чтобы он мог импортировать исполняемый файл, а затем просто выберите нужный файл. Когда появится диалоговое окно «Тип настраиваемого ресурса», введите RCDATA в поле «Тип ресурса».

Если вы откроете файл .rc, вы увидите что-то вроде этого:

/////////////////////////////////////////////////////////////////////////////
//
// RCDATA
//

IDR_RCDATA1          RCDATA               "myexecutable.exe"

и он сгенерирует resource.h со следующей строкой:

#define IDR_RCDATA1                  101

В коде вы получаете к нему доступ так:

#include "resource.h"
#include <windows.h>

int main(int argc, char* argv[])
{
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
    void* pMyExecutable = ::LockResource(myResourceData);
    return 0;
}

где pMyExecutable - указатель на первый байт этого исполняемого файла. Как узнать размер этого ресурса или другую полезную информацию вы найдете здесь:
http://msdn.microsoft.com/en-us/library/ff468902(v=vs.85).aspx

... вот пример, как вы могли бы сохранить бинарный ресурс, как этот, на диске:

#include "resource.h"
#include <windows.h>
#include <fstream>

int main(int argc, char* argv[])
{
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    unsigned int myResourceSize = ::SizeofResource(NULL, myResource);
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
    void* pMyExecutable = ::LockResource(myResourceData);

    std::ofstream f("C:\\x.exe", std::ios::out | std::ios::binary);
    f.write((char*)pMyExecutable, myResourceSize);
    f.close();

    return 0;
}

Когда вы создаете проект с таким ресурсом, этот ресурс станет частью вашей "программы" (.exe, .dll, ...).

Надеюсь, это поможет вам;)

1 голос
/ 26 января 2012

Программные ресурсы являются специфическим усовершенствованием Microsoft; используя их непосредственно сделает ваш код непереносимым (который может быть или не быть проблема). Альтернатива, которую я часто использовал, это написать небольшой «препроцессор», который преобразует ресурсы в источники C ++, которые я затем скомпилируйте. Например, если внешний файл является просто текстом, я мог бы напишите что-нибудь, что преобразует это из:

first line
second line 
third line

до

char const* name[] =
{
    "first line",
    "second line ",
    "third line",
    NULL
};

Затем я скомпилирую это и свяжу с финальной программой.

...