Как достать файл из ресурсов другого приложения?
Делается это достаточно просто, рассмотрим следующий пример:
Данное консольное приложение работает вместе с файлом “simple.dll” (далее “Исполняемым файлом”), который на момент запуска должен находиться в той же директории. Исполняемый файл имеет ресурс IDR_JPEG1 (простой jpg файл).
В файле resource.h:
В файле ресурсов simple.rc:
Как добавлять ресурсы в проект я думаю, вы сможете найти сами, поэтому этого я объяснять не стану. Зная всё вышеописанное, и имея скомпилированный файл simple.dll с указанным ресурсом, мы можем извлечь его при помощи простой программы:
В данном примере использовалась функция FindResource (подробное описание данной ф-ции доступно в (MSDN), последним параметром которой является тип ресурса (в примере это "JPEGs"), хочу отметить, что для стандартных ресурсов типы описаны в MSDN. (Типы ресурсов)
Данное консольное приложение работает вместе с файлом “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. (Типы ресурсов)