Замена ресурсов одного исполняемого файла на ресурсы другого
|
Q: При попытке перезаписать ресурс стандартными методами для работы с файлами (CreateFile, WriteFile) получил испорченный исполняемый файл. Но ведь редакторы ресурсов как-то это делают! Но вот как?! 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; }
| |