13.03.01 09:56 От кого <katjurin@mail.novosoft.ru> Кому <kaev@yandex.ru> Привет Артем. Я вот тут подумал . Xто будет интересно и не только мне узнать как пишуться эти загадочные инсталяторы. Допустим есть какой угодно файл,нужно написать прогу которая при запуске просто выплевывала бы его из себя в системную папку. Я вот ума не прихожу как его обвернуть. Я думаю что получился бы очень коротенький и интересный шажок. Sincerely, Katjurin Stanislav *Software Developer *Novosoft Inc.
Мы создадим простой проект. Вы можете взять готовый из "Шаг 1 - Минимальный проект" и изменить его. . Во первых нам нужно создать файл ресурсов в проекте. У нас его нет. Выше первый шаг взяли. Как это сделать смотрите "Шаг 6 - Создание меню". Скопируем в папку проекта файл command.com. Над ним мы и будет экспериментировать.
А теперь мы его импортируем в ресурсы.
Подключаем описание ресурсов.
...... #include "afxwin.h" // MFC Основные и стандартные компоненты #include "resource.h" class CMainWnd : public CFrameWnd ......
Нам нужно только изменить функции InitInstance.
BOOL CMyApp::InitInstance() // стандартная инициализация { HRSRC rc=NULL; rc=FindResource(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_RT_EXE1),"RT_EXE"); // ищем ресурс DWORD dwSize; if (rc!=NULL) { HGLOBAL hgl=NULL; dwSize = SizeofResource(AfxGetResourceHandle(), rc); // определяем размер ресурса hgl=LoadResource(AfxGetResourceHandle(),rc); // читаем ресурс if (hgl!=NULL) { CFile cf; cf.Open("c:\\temp\\command.com", CFile::modeCreate | CFile::modeWrite); cf.WriteHuge(hgl,dwSize); // из ресурса в файл cf.Close(); FreeResource(hgl); // освободить ресурс AfxMessageBox("Install is Ok"); return FALSE; // типа не смогли, выходим } } AfxMessageBox("Install not Ok"); return FALSE; // типа не смогли, выходим };
Во первых в ресурсы можно импортировать все что угодно. Любой файл. В данному случаем EXE. Но не какой разницы нет, можно WAV, можно HTML, можно MDB и так далее. Только если импортируется что то нестандартное, как EXE нужно будет указывать тип ресурса в окне при импорте. Это будет наш тип. И при поиске нужно будет указывать именно наш тип.
Найдя тип ресурсов нам нужно определить размер, что бы можно было писать в файл. Многие функции работы скажем с картинками умеют это делать автоматически и мы ими пользуемся не задумываясь просто передавая указатель. В данном случае размер ресурса нам нужен.
DWORD SizeofResource ( HMODULE hModule, // указатель на модуль HRSRC hResInfo // указатель на ресурс ); // в случае ошибке вернет 0 иначе размер
Ну а дальше тривиально до невозможности, пишем одним заходом в файл и готово. В результате работы программы в папку c:\temp запишеться command.com. Зайдите и посмотрите он запускаеться даже.
В ресурсах может находиться все что угодно.
После получения указателя можно определить размер.
Имея указатель и размер можно писать в файл. Так например Вы можете извлекать ресурсы в свои файлы из других программ.