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. Зайдите и посмотрите он запускаеться даже.
В ресурсах может находиться все что угодно.
После получения указателя можно определить размер.
Имея указатель и размер можно писать в файл. Так например Вы можете извлекать ресурсы в свои файлы из других программ.