Замена ресурсов одного исполняемого файла на ресурсы другого
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; } |