Удаление ресурсов из exe

Тема в разделе "WASM.WIN32", создана пользователем perdimonokl, 26 янв 2008.

  1. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Делаю win32 проект в MSVS добавляю в ресурсы файл. Пишу в rc файле проекта так:
    Код (Text):
    1. RCFILE          RT_RCDATA     "file.exe"
    Компилю пустой проект только в rc фале вот запись та что я написал. Переименовываю готовый exe в del.exe

    Делаю консольное приложение туда сую такой код:

    Код (Text):
    1. #include <windows.h>
    2.  
    3. int main(int argc,char* argv[])
    4. {
    5.     HANDLE hUpdateRes;
    6.  
    7.     hUpdateRes = BeginUpdateResource("del.exe", false);
    8.     UpdateResource(hUpdateRes, RT_RCDATA, "RCFILE",MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), NULL, NULL);
    9.     EndUpdateResource(hUpdateRes, false);
    10.  
    11. return 0;
    12. }
    Хочу удалить из del.exe тот файл что я засунул ему в ресурсы с помощью этого консольного приложени, а они не удаляются. Пробовал и юникод и анси варианты кода и всё равно не удаляет из ресурсов ничего но дата фала меняется и у del.exe то есть ресурсы то апдейтятся как бы но как тот файл что я засунул был в ресурсах так и есть. Код вроде правильный а не пашет почему то. Кто что посоветует?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    дык указал бы второй параметр 1 чтобы стереть существующие ресурсы.
     
  3. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Ух ты ё помогло :) Спасибки Great но только удаляет со второго раза почему то

    Код (Text):
    1. #include <windows.h>
    2.  
    3. int main(int argc,char* argv[])
    4. {
    5.     HANDLE hUpdateRes;
    6.  
    7.     hUpdateRes = BeginUpdateResource("del.exe", false);
    8.     UpdateResource(hUpdateRes,MAKEINTRESOURCE(1), NULL,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), NULL, NULL);
    9.     EndUpdateResource(hUpdateRes, false);
    10.  
    11. return 0;
    12. }
    Хм странно... Сейчас заметил что и тот код который я пидал в первом посте тоже удаляет ресурсы но только со 2-го раза. Через GetLastError() пишет что "Неправильно задан параметр". То есть вызов я ставит если UpdateResource возвратит 0 и на первый и на второй раз ругается что "Неправильно задан параметр" но на второй наз удаляет ресурсы. Чёт и отладчик не натолкнул меня на мысль почему так происходит.

    Может кто сталкивался?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    perdimonokl
    Ух ты ё помогло
    Imho Great имел ввиду второй параметр функции BeginUpdateResource.
     
  5. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Ага я уже разобрался вот как раз зашёл отписать и код кинуть может кому да пригодится

    Код (Text):
    1. BOOL WINAPI DeleteResource(char* UpdateFile, char *ResType, char *ResName)
    2. {
    3. HANDLE hUpdateRes;
    4.    
    5.     hUpdateRes = BeginUpdateResource(UpdateFile, true);
    6.     UpdateResource(hUpdateRes,ResType,ResName, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), NULL, NULL);
    7.     EndUpdateResource(hUpdateRes, false);
    8.  
    9.     return TRUE;
    10. }
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    perdimonokl
    я уже разобрался ... код ... может кому да пригодится
    Сомневаюсь.

    Если ты хотел удалить _все_ ресурсы из файла, то достаточно было вызвать две функции
    Код (Text):
    1. ...
    2. if (NULL != (hRes = BeginUpdateResource(lpFileName, TRUE)))
    3.   EndUpdateResource(hRes, FALSE);
    4. ...
    Если ты хотел удалить определенный ресурс, то твой код не учитывает, что удаляемый ресурс может принадлежать языку отличному от MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), и не понятно почему второй параметр BeginUpdateResource - true.
     
  7. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    q_q Ты же мне сам сказал поставить в BeginUpdateResource второй параметр в true чё ты удивляешься то? А удалить я хотел определённый ресурс а не все :) А если чтото не так то ты просто поправь код и всё да клади я пойму
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    perdimonokl
    Ты же мне сам сказал поставить в BeginUpdateResource второй параметр в true
    Ты что-то путаешь, по поводу второго параметра см. #2.
     
  9. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    появилась аналогичная проблема.
    Код (Text):
    1. LANG_NEUTRAL = 0
    2. SUBLANG_DEFAULT = 1  
    3.         BeginUpdateResource('C:\3.exe',FALSE)
    4.         mov edi,eax
    5.         mov ecx,SUBLANG_DEFAULT
    6.         shl ecx,10
    7.         mov cl,LANG_NEUTRAL
    8.         UpdateResource(edi,RT_GROUP_ICON,17,ecx,0,0)
    9.         .if eax
    10.             EndUpdateResource(edi,FALSE)
    11.         .else
    12.             EndUpdateResource(edi,TRUE)
    13.         .endif
    UpdateResource возвращает ERROR_INVALID_PARAMETR.
    Ид ресурса 17 открывал смотрел.
    edi - хэндл, тоже нормально.
    последнии два параметра тоже правильны, для удаления оба должны быть нули. Почему не работает, не могу понять.
    ecx - 400h получаеться, вроде так и должно быть.

    может знает кто?
     
  10. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    хм... поставил wLanguage = 0 и заработало.
     
  11. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    подскажите, может кто знает.
    секцея ресурсов в файле предпоследняя, изменяя её(UpdateResource), стала не доступной последняя сейции, т.к. смещения то изменились.
    то есть она то доступна, но смещения барахлят.

    как с этим бороться?