Шаг 356 - EXE файл в ресурсах

13.03.01 09:56  
От кого <katjurin@mail.novosoft.ru>   
Кому <kaev@yandex.ru> 
 
Привет Артем.
Я вот тут подумал . Xто будет интересно и не только мне узнать  как пишуться
эти загадочные инсталяторы. Допустим есть какой угодно файл,нужно написать прогу 
которая при запуске просто выплевывала бы его из себя в системную папку.
Я вот ума не прихожу как его обвернуть. Я думаю что получился бы очень коротенький 
и интересный шажок.
Sincerely,
Katjurin Stanislav
*Software Developer
*Novosoft Inc. 

Создание проекта

Мы создадим простой проект. Вы можете взять готовый из "Шаг 1 - Минимальный проект" и изменить его. . Во первых нам нужно создать файл ресурсов в проекте. У нас его нет. Выше первый шаг взяли. Как это сделать смотрите "Шаг 6 - Создание меню". Скопируем в папку проекта файл command.com. Над ним мы и будет экспериментировать.

356_1.gif (2365 b)

А теперь мы его импортируем в ресурсы.

356_2.gif (2695 b)

Создаем код

Подключаем описание ресурсов.

......
#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 нужно будет указывать тип ресурса в окне при импорте. Это будет наш тип. И при поиске нужно будет указывать именно наш тип.

356_3.gif (3234 b)

Найдя тип ресурсов нам нужно определить размер, что бы можно было писать в файл. Многие функции работы скажем с картинками умеют это делать автоматически и мы ими пользуемся не задумываясь просто передавая указатель. В данном случае размер ресурса нам нужен.

DWORD SizeofResource
(  
  HMODULE hModule, // указатель на модуль
  HRSRC hResInfo   // указатель на ресурс
);
// в случае ошибке вернет 0 иначе размер

Ну а дальше тривиально до невозможности, пишем одним заходом в файл и готово. В результате работы программы в папку c:\temp запишеться command.com. Зайдите и посмотрите он запускаеться даже.

Шпаргалка

В ресурсах может находиться все что угодно.

После получения указателя можно определить размер.

Имея указатель и размер можно писать в файл. Так например Вы можете извлекать ресурсы в свои файлы из других программ.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 29.06.2001