Как достать файл из ресурсов другого приложения?

Делается это достаточно просто, рассмотрим следующий пример:

Данное консольное приложение работает вместе с файлом “simple.dll” (далее “Исполняемым файлом”), который на момент запуска должен находиться в той же директории. Исполняемый файл имеет ресурс IDR_JPEG1 (простой jpg файл).
В файле resource.h:
#define IDR_JPEG1 1001

В файле ресурсов simple.rc:
/////////////////////////////////////////////////////////////////////////////
//
// JPEGs
//
IDR_JPEGS1              JPEGs   DISCARDABLE     "Image1.jpg"

Как добавлять ресурсы в проект я думаю, вы сможете найти сами, поэтому этого я объяснять не стану. Зная всё вышеописанное, и имея скомпилированный файл simple.dll с указанным ресурсом, мы можем извлечь его при помощи простой программы:
// Хидеры программы
#include <windows.h>
#include <iostream.h>

// 1001 - число идентификатора в исполняемом файле (как и в resource.h у проекта 
// исполняемого файла simple.dll)
#define IDR_JPEG1 1001

// Ф-ция для извлечения ресурса
bool ExtractMyJpeg()
{

// Инициализируем переменные
HRSRC hRes = 0;
HGLOBAL hData = 0;
LPVOID pData;

// Загружаем исполняемый файл (в данном случае dll)
HMODULE hModule = LoadLibrary("simple.dll");
// Если не удалось загрузить исполняемый файл, то выходим
if(hModule == NULL) return false;

// Находим ресурс в исполняемом файле, указав идентификатор и тип ресурса 
// (в примере это "JPEGs"),
hRes = FindResource(hModule, MAKEINTRESOURCE(IDR_JPEG1), "JPEGs");
// Если ресурс не найден, то выходим
if(hRes == NULL)
{
// Освобождаем исполняемый файл
FreeLibrary(hModule);
return false;
}

// Получаем размер ресурса для того, чтобы сохранить его в файл
DWORD dwSize = SizeofResource(hModule,hRes);
// Если не смогли получить размер, то выходим
if(dwSize == NULL)
{
// Освобождаем исполняемый файл
FreeLibrary(hModule);
return false;
}

// Загружаем ресурс
hData = LoadResource(hModule, hRes);
// Если не смогли загрузить, то выходим
if(hData == NULL)
{
// Освобождаем исполняемый файл
FreeLibrary(hModule);
return false;
}

// Фиксируем ресурс в памяти и получаем указатель на первый байт ресурса
pData = LockResource(hData);
// Если не удалось зафиксировать ресурс, то выходим
if(pData == NULL)
{
// Освобождаем исполняемый файл
FreeLibrary(hModule);
return false;
}

// Создаём файл, в который будем писать
HANDLE File = CreateFile("data.jpg",GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_ALWAYS,0,0);
// Если не удалось создать файл, то выходим
if(File == INVALID_HANDLE_VALUE)
{
// Освобождаем исполняемый файл
FreeLibrary(hModule);
return false;
}

// Переменная для ф-ции записи в файл
DWORD Written=0;

// Записываем весь ресурс в файл
if(WriteFile(File,pData,dwSize,&Written,0)==NULL)
{
// Освобождаем исполняемый файл
FreeLibrary(hModule);
// Закрываем хендл файла
CloseHandle(File);
return false;
}

// Закрываем хендл файла
CloseHandle(File);
// Освобождаем исполняемый файл
FreeLibrary(hModule);
return true;
}

int main()
{
// Если не удалось извлечь ресурс, то сообщаем об ошибке
if(!ExtractMyJpeg())
{
// Сообщаем об ошибке
cout << "Error No " << GetLastError() << endl;
}
return 0;
}

В данном примере использовалась функция FindResource (подробное описание данной ф-ции доступно в (MSDN), последним параметром которой является тип ресурса (в примере это "JPEGs"), хочу отметить, что для стандартных ресурсов типы описаны в MSDN. (Типы ресурсов)
 
« Предыдущая статья