Update .exe-шника и перезапуск процесса

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 16 ноя 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Программа (для простоты - единственный .exe-шник) по сети решила обновить сама себя. Вот она скачала новый .exe-шник. Есть две задачи. Первое - заменить текущий .exe-шник на новый. И второе - завершить процесс и запустить по новой. Нужно чтобы работало на WinXP и выше.

    У меня пока что такое решение... Процесс не может удалить свой .exe-шник, но может переименовать. Переименовываем prog.exe в prog.old.exe, и записываем на место prog.exe новую версию.

    Теперь делаем CreateProcess на новый .exe-шник и выходим из процесса. В новом .exe-шнике при старте смотрим, нет ли файла prog.old.exe. Если есть - то пытаемся его удалить. Если access denied (старая версия еще не успела завершиться) - немного слипаем и повторяем попытку снова.

    Вопрос: нормальная ли это схема, будет ли она работать на WinXP+, и нет ли решения попроще?
     
  2. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    а как оно может не работать?
    нормальный вариант, разве что культурнее было бы передавать линк на prog.exe.old в параметр к prog.exe.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Comer_

    Да очень просто. Ничуть не удивлюсь, если нельзя переименовывать .exe, пока он запущен, под вистой или вин7.
     
  4. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    запустить скрипт от cmd.exe
     
  5. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    может быть лучше
    Качаем новые сохраняем
    Save -> prog.dmp
    CreateProcess -> prog.dmp
    DeleteFile -> prog.exe
    CopyFile -> prog.dmp, prog.exe
    CreateProcess -> prog.exe
    DeleteFile -> prog.dmp
     
  6. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    При старте просто копируешь своё тело в какой-либо процесс (explorer.exe напр.) и выходишь. После этого делаешь со свом exe всё что хочешь.
     
  7. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    [​IMG]

    любишь бдсм и шибари?
    разве оп указал что обязательно пишет трой?

    юзер бы с недоверием покосился на фаерволлы, которые бы недоверчиво покосились на ехе, вовсю демонстрирующий "размножение почкованием: электронная версия" в доверенные процессы.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Гомер прав - речь-то о белой тулзе. Бросайте свои хацкерские причиндалы))
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Некоторые "белые тулзы" вешают сервис обновления. Но думаю вполне разумный подход это скачать всё во временную папку, запустить некий процесс который прибъёт родителя, скопирует всё необходимое и самоликвидируется.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Хотя и прибивать родителя специально не нужно, он сам может прибиться. При следующем запуске может быть проверка обновления из темпа.
     
  11. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Та вроде можно)) Да и какая разница, ты запускаешь новый екзешник, а в старом делаешь ExitProcess, в новом либо просто Sleep(1000) в начале, либо если красиво то WaitForSingleObject. Дальше путь к старому у тебя есть, делаешь с ним что угодно.
    Вообще помоему лучше сделать отдельный екзешник для апдейта маленький, которому передавать например путь к старому екзе и ссылку на новый, ну а он уже все остальное сделает.
     
  12. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    [​IMG]

    можно ещё выводить сообщения с внушением пользователю нажать win+r и набрать iexplore.exe http://addr.ua/ где будет висеть сплоент с лоадером, готовым загрузить бота, который вырубит старое приложение, скачает-поставит новое и отрепортит ботсерверу, угу.
    бдсм.
     
  13. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Можно написать простой лаунчер который из реестра/конфига будет вычитывать имя экзешника и запускать ту версию которая необходима.
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Еще вопрос...
    Хочется решить в пределах одного .exe-шника. Нужно чтобы программа могла обнаружить, что она уже запущена (т.н. single instance). Создавать какие-то глобальные объекты-идентификаторы, записи в реестре или файлы - не хочется, т.к. при креше соответствующий признак не будет выпилен. Можно смотреть по имени процесса. Но! Если смотреть по имени процесса, не ясно как разруливать ситуацию с перезапуском и единственным .exe-шником...
     
  15. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    а мутексы в висте разве отсутствуют?
     
  16. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    в опере, например, процесс перезапуска ехе вообще не автоматизирован. так что если апликуха пользовательска, аля office, то можно и на юзера свалить задачу: сохранить данные, убить процесс и пр.
     
  17. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    Именованное событие
    CreateEvent("{GUID}");
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Если софт "белый", то я думаю, что можно обойтись и без обновлений во время работы программы, и обновлять ее лишь при запуске:

    Есть отдельный starter.exe, функциями которого являются:
    1) проверить обновления, скачать, если они имеются;
    2) запустить обновленную программу.

    Соответственно запускать не саму программу, а starter.
    Вроде без извращений.
     
  19. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Я такую задачу решил банально: вывешиваю не обновлённый exe, а инсталляционный файл, загружаю его, запускаю и завершаю основную программу. Вопрос "куда загружать и как потом удалять" - на усмотрение автора, можно при инсталляции прописать путь к обновлятору в свою ветку реестра, а при первом запуске файл удалить.
     
  20. dr_godsl

    dr_godsl New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2009
    Сообщения:
    60
    встречал theme-pack для ХР, так он помимо того что инсталил темы еще и обновлял uxtheme.dll на лету. как он это делает не разбирался, после установки показывал окошко о перезагрузке через 3 сек. и пофиг ему было, что uxtheme.dll присутствует почти во всех процессах.
    еще можно поковырять обновления для самой винды, в принципе они делают тоже самое, только вышли из под молотка мелкомягких, а уж они то точно знают как безболезненно менять то что уже находится в памяти.