Замена ресурсов одного исполняемого файла на ресурсы другого
Q: При попытке перезаписать ресурс стандартными методами для работы с файлами (CreateFile, WriteFile) получил испорченный исполняемый файл. Но ведь редакторы ресурсов как-то это делают! Но вот как?!
A: Таким способом редактировать ресурсы слишком сложно, и делается это не совсем так, потому, что сами вы не сможете узнать (а если сможете, то скорее пожалеете, что взялись за это дело ), где ресурс начинается и где он заканчивается в исполняемом файле.
Следующий код показывает, как можно заменить ресурс одного приложения на ресурс другого:
A: Таким способом редактировать ресурсы слишком сложно, и делается это не совсем так, потому, что сами вы не сможете узнать (а если сможете, то скорее пожалеете, что взялись за это дело ), где ресурс начинается и где он заканчивается в исполняемом файле.
Следующий код показывает, как можно заменить ресурс одного приложения на ресурс другого:
BOOL ReplaceIcon(WORD Number) { // Переменные для работы с ресурсами 2-х исполняемых файлов HGLOBAL hResLoad; HMODULE hModule; HRSRC hRes; HANDLE hUpdateRes; LPVOID lpResLock; BOOL result; // Загружаем исполняемый файл из которого будем копировать ресурс hModule = LoadLibrary("first.exe"); // Если загрузить не удалось, то выходим if(hModule == NULL) return FALSE; // Ищем ресурс в памяти исполняемого файла hRes = FindResource(hModule, MAKEINTRESOURCE(1), RT_ICON); // Если найти ресурс не удалось, то выходим if(hRes == NULL) { // Освобождаем исполняемый файл FreeLibrary(hModule); return FALSE; } // Загружаем ресурс hResLoad = LoadResource(hModule, hRes); // Если загрузить ресурс не удалось, то выходим if(hResLoad == NULL) { // Освобождаем исполняемый файл FreeLibrary(hModule); return FALSE; } // Фиксируем ресурс lpResLock = LockResource(hResLoad); // Если не удалось зафиксировать ресурс, то выходим if(lpResLock==NULL) { // Освобождаем исполняемый файл FreeLibrary(hModule); return FALSE; } // Пытаемся начать обновлять ресурс второго файла hUpdateRes = BeginUpdateResource("second.exe", false); // Если не удалось начать обновление, то выходим if (hUpdateRes == NULL) { // Освобождаем исполняемый файл FreeLibrary(hModule); return FALSE; } // Собственно тут и происходит обновление ресурса result = UpdateResource(hUpdateRes,RT_ICON,MAKEINTRESOURCE(Number), MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),lpResLock,SizeofResource(hModule, hRes)); // Если не удалось обновить ресурс, то выходим if (result == FALSE) { // Освобождаем исполняемый файл FreeLibrary(hModule); return FALSE; } // Завершаем обновление if(EndUpdateResource(hUpdateRes, FALSE) == NULL){ // Освобождаем исполняемый файл FreeLibrary(hModule); return FALSE; } // Освобождаем загруженый исполняемый файл if(FreeLibrary(hModule) == NULL) return FALSE; return TRUE; } |