Замена ресурсов одного исполняемого файла на ресурсы другого

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;
}
 
« Предыдущая статья   Следующая статья »