Проблема с ресурсами PE EXE

Тема в разделе "WASM.WIN32", создана пользователем VaZoNeZ, 25 апр 2010.

  1. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    В общем - задача состоит в перенесении определенных ресурсов (например RT_GROUP_ICON) из одного EXE в другой. Мне задача показалось несложной, но возникла проблема:

    EnumResourceTypes -> EnumResourceNames -> FindResource -> SizeofResource (выдает маленькое значение) -> LoadResource -> LockResource -> по адресу белиберда, а не иконка

    Энумерация ресурсов происходит нормально, все работает, ошибок не возникает, но вот при копировании происходит лабуда - копируется не иконка, а какие-то данные; SizeofResource возвращает значение в пределах 60-150 байт, что есть маловато. Думаю, это какая-то неизвестная мне структура или хз что.
    Натолкните на мысль, что это :) Что нашел в гугле - у Питрека мало как-то, PEDUMP не прояснил ситуации.
     
  2. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    RT_GROUP_ICON / RT_GROUP_CURSOR - это не сама иконка/курсор, это группа. Структура (точнее, несколько структур), объединяющая несколько одинаковых ресурсов с разными параметрами в один. Нужна, чтобы в зависимости от возможностей устройства (количество цветов, и.т.п.) можно было выбрать подходящий ресурс для отображения. Битмапы же находятся в RT_ICON / RT_CURSOR.

    Почитайте внимательно эту статью в мсдн - Resource File Formats.
     
  3. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Код (Text):
    1. ...
    2.     HMODULE hLib=LoadLibraryEx(lpFile,NULL,LOAD_LIBRARY_AS_DATAFILE);
    3.     if (hLib)
    4.         {
    5.         HANDLE hResource;
    6.         hResource = BeginUpdateResource(lpNewFile,TRUE);
    7.         if (hResource)
    8.         {
    9.             byte done=0;
    10.                     done+=EnumResourceNames(hLib,RT_ICON,(ENUMRESNAMEPROC) UpdateResources,(long) hResource);
    11.             done+=EnumResourceNames(hLib,RT_GROUP_ICON,(ENUMRESNAMEPROC) UpdateResources,(long) hResource);
    12.             done+=EnumResourceNames(hLib,RT_VERSION,(ENUMRESNAMEPROC) UpdateResources,(long) hResource);
    13.  
    14.                 EndUpdateResource(hResource,done ? FALSE : TRUE);
    15.         }
    16.         FreeLibrary(hLib);
    17.     }
    18.  
    19.  
    20. ...
    21.  
    22. bool CALLBACK UpdateResources(HMODULE hModule,LPCTSTR lpType,LPTSTR lpName,long lParam)
    23. {
    24.     HRSRC hRes = FindResource(hModule,lpName,lpType);
    25.     HGLOBAL hResLoaded = LoadResource(hModule,hRes);
    26.     void *pData = LockResource(hResLoaded);
    27.     int nSizeOfRes = SizeofResource(hModule,hRes);
    28.     UpdateResource((HANDLE)lParam,lpType,lpName,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),pData,nSizeOfRes);
    29.     UnlockResource(hResLoaded);
    30.     FreeResource(hResLoaded);
    31.  
    32.     return TRUE;
    33. }
     
  4. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    G13, спасибо за информацию, читаю.
    Marazm, спасибо за код, работает отлично.

    Тема закрыта, всем спасибо.