Программа (для простоты - единственный .exe-шник) по сети решила обновить сама себя. Вот она скачала новый .exe-шник. Есть две задачи. Первое - заменить текущий .exe-шник на новый. И второе - завершить процесс и запустить по новой. Нужно чтобы работало на WinXP и выше. У меня пока что такое решение... Процесс не может удалить свой .exe-шник, но может переименовать. Переименовываем prog.exe в prog.old.exe, и записываем на место prog.exe новую версию. Теперь делаем CreateProcess на новый .exe-шник и выходим из процесса. В новом .exe-шнике при старте смотрим, нет ли файла prog.old.exe. Если есть - то пытаемся его удалить. Если access denied (старая версия еще не успела завершиться) - немного слипаем и повторяем попытку снова. Вопрос: нормальная ли это схема, будет ли она работать на WinXP+, и нет ли решения попроще?
а как оно может не работать? нормальный вариант, разве что культурнее было бы передавать линк на prog.exe.old в параметр к prog.exe.
Comer_ Да очень просто. Ничуть не удивлюсь, если нельзя переименовывать .exe, пока он запущен, под вистой или вин7.
может быть лучше Качаем новые сохраняем Save -> prog.dmp CreateProcess -> prog.dmp DeleteFile -> prog.exe CopyFile -> prog.dmp, prog.exe CreateProcess -> prog.exe DeleteFile -> prog.dmp
При старте просто копируешь своё тело в какой-либо процесс (explorer.exe напр.) и выходишь. После этого делаешь со свом exe всё что хочешь.
любишь бдсм и шибари? разве оп указал что обязательно пишет трой? юзер бы с недоверием покосился на фаерволлы, которые бы недоверчиво покосились на ехе, вовсю демонстрирующий "размножение почкованием: электронная версия" в доверенные процессы.
Некоторые "белые тулзы" вешают сервис обновления. Но думаю вполне разумный подход это скачать всё во временную папку, запустить некий процесс который прибъёт родителя, скопирует всё необходимое и самоликвидируется.
Хотя и прибивать родителя специально не нужно, он сам может прибиться. При следующем запуске может быть проверка обновления из темпа.
Та вроде можно)) Да и какая разница, ты запускаешь новый екзешник, а в старом делаешь ExitProcess, в новом либо просто Sleep(1000) в начале, либо если красиво то WaitForSingleObject. Дальше путь к старому у тебя есть, делаешь с ним что угодно. Вообще помоему лучше сделать отдельный екзешник для апдейта маленький, которому передавать например путь к старому екзе и ссылку на новый, ну а он уже все остальное сделает.
можно ещё выводить сообщения с внушением пользователю нажать win+r и набрать iexplore.exe http://addr.ua/ где будет висеть сплоент с лоадером, готовым загрузить бота, который вырубит старое приложение, скачает-поставит новое и отрепортит ботсерверу, угу. бдсм.
Можно написать простой лаунчер который из реестра/конфига будет вычитывать имя экзешника и запускать ту версию которая необходима.
Еще вопрос... Хочется решить в пределах одного .exe-шника. Нужно чтобы программа могла обнаружить, что она уже запущена (т.н. single instance). Создавать какие-то глобальные объекты-идентификаторы, записи в реестре или файлы - не хочется, т.к. при креше соответствующий признак не будет выпилен. Можно смотреть по имени процесса. Но! Если смотреть по имени процесса, не ясно как разруливать ситуацию с перезапуском и единственным .exe-шником...
в опере, например, процесс перезапуска ехе вообще не автоматизирован. так что если апликуха пользовательска, аля office, то можно и на юзера свалить задачу: сохранить данные, убить процесс и пр.
Если софт "белый", то я думаю, что можно обойтись и без обновлений во время работы программы, и обновлять ее лишь при запуске: Есть отдельный starter.exe, функциями которого являются: 1) проверить обновления, скачать, если они имеются; 2) запустить обновленную программу. Соответственно запускать не саму программу, а starter. Вроде без извращений.
Я такую задачу решил банально: вывешиваю не обновлённый exe, а инсталляционный файл, загружаю его, запускаю и завершаю основную программу. Вопрос "куда загружать и как потом удалять" - на усмотрение автора, можно при инсталляции прописать путь к обновлятору в свою ветку реестра, а при первом запуске файл удалить.
встречал theme-pack для ХР, так он помимо того что инсталил темы еще и обновлял uxtheme.dll на лету. как он это делает не разбирался, после установки показывал окошко о перезагрузке через 3 сек. и пофиг ему было, что uxtheme.dll присутствует почти во всех процессах. еще можно поковырять обновления для самой винды, в принципе они делают тоже самое, только вышли из под молотка мелкомягких, а уж они то точно знают как безболезненно менять то что уже находится в памяти.