2012-01-26 2 views
1

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

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

Например:

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

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

+1

Не могли бы вы дать более подробный пример того, что вы пытаетесь сделать? также, что вы пробовали до сих пор? – NirMH

+0

Ну, я знаю, как читать файл, но я просто не знаю, как сохранить его содержимое в моей программе на C++, чтобы они «оставались там» после закрытия моей программы на C++. –

+2

Открыть новый файл в режиме записи и скопировать его содержимое. –

ответ

1

Если вы используете 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, ...).

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

+0

Спасибо за ваш ответ, Но как я могу использовать его во время выполнения? Просто укажите «Resource Files/myfile.exe» или есть специальный код? –

+1

@Buxme Я обновил свой ответ. Теперь он показывает, как использовать этот вид ресурсов ... наслаждайтесь;) – LihO

1

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

first line 
second line 
third line 

в

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

Я затем компилировать это и связать его с окончательной программы.

Смежные вопросы