Корректировка ресурсов


Пример ниже копирует ресурс диалогового окна из одного исполняемого файла, 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 завершаем корректировку.

Нижеследующий код реализует эти шаги.

Обратите внимание! на то, что неправильное использование LoadLibrary может поставить под угрозу защиту вашего приложения, загружая неправильную DLL. Обратитесь к документации  LoadLibrary за информацией о том, как правильно загружать DLLs в разных версиях Microsoft ® Windows ®.

Демонстрационный пример

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