В общем - задача состоит в перенесении определенных ресурсов (например RT_GROUP_ICON) из одного EXE в другой. Мне задача показалось несложной, но возникла проблема: EnumResourceTypes -> EnumResourceNames -> FindResource -> SizeofResource (выдает маленькое значение) -> LoadResource -> LockResource -> по адресу белиберда, а не иконка Энумерация ресурсов происходит нормально, все работает, ошибок не возникает, но вот при копировании происходит лабуда - копируется не иконка, а какие-то данные; SizeofResource возвращает значение в пределах 60-150 байт, что есть маловато. Думаю, это какая-то неизвестная мне структура или хз что. Натолкните на мысль, что это Что нашел в гугле - у Питрека мало как-то, PEDUMP не прояснил ситуации.
RT_GROUP_ICON / RT_GROUP_CURSOR - это не сама иконка/курсор, это группа. Структура (точнее, несколько структур), объединяющая несколько одинаковых ресурсов с разными параметрами в один. Нужна, чтобы в зависимости от возможностей устройства (количество цветов, и.т.п.) можно было выбрать подходящий ресурс для отображения. Битмапы же находятся в RT_ICON / RT_CURSOR. Почитайте внимательно эту статью в мсдн - Resource File Formats.
Код (Text): ... HMODULE hLib=LoadLibraryEx(lpFile,NULL,LOAD_LIBRARY_AS_DATAFILE); if (hLib) { HANDLE hResource; hResource = BeginUpdateResource(lpNewFile,TRUE); if (hResource) { byte done=0; done+=EnumResourceNames(hLib,RT_ICON,(ENUMRESNAMEPROC) UpdateResources,(long) hResource); done+=EnumResourceNames(hLib,RT_GROUP_ICON,(ENUMRESNAMEPROC) UpdateResources,(long) hResource); done+=EnumResourceNames(hLib,RT_VERSION,(ENUMRESNAMEPROC) UpdateResources,(long) hResource); EndUpdateResource(hResource,done ? FALSE : TRUE); } FreeLibrary(hLib); } ... bool CALLBACK UpdateResources(HMODULE hModule,LPCTSTR lpType,LPTSTR lpName,long lParam) { HRSRC hRes = FindResource(hModule,lpName,lpType); HGLOBAL hResLoaded = LoadResource(hModule,hRes); void *pData = LockResource(hResLoaded); int nSizeOfRes = SizeofResource(hModule,hRes); UpdateResource((HANDLE)lParam,lpType,lpName,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),pData,nSizeOfRes); UnlockResource(hResLoaded); FreeResource(hResLoaded); return TRUE; }
G13, спасибо за информацию, читаю. Marazm, спасибо за код, работает отлично. Тема закрыта, всем спасибо.