WinPro logo. Перейти на сайт www.winpro.narod.ru

Пример копирования ресурсов между исполняемыми файлами



В следующем примере копируется ресурс диалогового окна из файла 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."); 
} 
Hosted by uCoz