Пример копирования ресурсов между исполняемыми файлами
В следующем примере копируется ресурс диалогового окна из файла Hand.exe в файл Foot.exe в следующей последовательности:
1) Функцией LoadLibrary загружается файл Hand.exe
2) Функции FindResource и LoadResource используются для поиска и загрузки ресурса диалогового окна
3) Функция LockResource предоставляет указатель на данные ресурса диалогового окна
4) BeginUpdateResource открывает описатель файла Foot.exe
5) UpdateResource копирует ресурс из Hand.exe в Foot.exe
6) EndUpdateResource завершает обновление
HRSRC hResLoad; // описатель загружаемого ресурса
HANDLE hExe; // описатель существующего .EXE файла
HRSRC hRes; // описатель/указатель на инф-ю рес-са в hExe
HANDLE hUpdateRes; // описатель обновляемого ресурса
char *lpResLock; // указатель на данные ресурса
BOOL result;
// Загрузка .EXE файла содержащего необходимое диалоговое коно.
hExe = LoadLibrary("hand.exe");
if (hExe == NULL)
{
ErrorHandler("Could not load exe.");
}
// Поиск ресурса диалогового окна в .EXE файле.
hRes = FindResource(hExe, "AboutBox", RT_DIALOG);
if (hRes == NULL)
{
ErrorHandler("Could not locate dialog box.");
}
// Загрузка диалогового окна в глобальную память.
hResLoad = LoadResource(hExe, hRes);
if (hResLoad == NULL)
{
ErrorHandler("Could not load dialog box.");
}
// получение указателя на диалоговое окно в глобальной памяти.
lpResLock = LockResource(hResLoad);
if (lpResLock == NULL)
{
ErrorHandler("Could not lock dialog box.");
}
// Открытие файла в который нужно добавить ресурс диалогового окна.
hUpdateRes = BeginUpdateResource("foot.exe", FALSE);
if (hUpdateRes == NULL)
{
ErrorHandler("Could not open file for writing.");
}
// Добавление ресурса в список обновления.
result = UpdateResource(hUpdateRes, // описатель для обновления
RT_DIALOG, // заменить ресурс диалогового окна
"AboutBox", // имя диалогового окна
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // нейтральный язык
lpResLock, // указатель на ресурс
SizeofResource(hExe, hRes)); // размер ресурса.
if (result == FALSE)
{
ErrorHandler("Could not add resource.");
}
// Запись изменений в FOOT.EXE и его закрытие.
if (!EndUpdateResource(hUpdateRes, FALSE))
{
ErrorHandler("Could not write changes to file.");
}
// Зачистка
if (!FreeLibrary(hExe))
{
ErrorHandler("Could not free executable.");
}
