![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как исполняемому файлу перезаписать самого себя ? [D7, Win2k, WinXP]
incm © (2007-12-17 17:39:00)Нужно программе которая в данный момент выполняется, заменить свой собственный *.exe файл.
clickmaker (2007-12-18 18:38:00) [1]
> А как запустить файл *.bin? Или только переименовывать ?
CreateProcess
MetalFan (2007-12-18 18:21:00) [2]
> Strate (18.12.07 08:20) [12]
сорь, не заметил поста
MetalFan (2007-12-18 18:21:00) [3]а если "обновлятель" в ресурсы зашить и при необходимости из ресурсов доставать?
будет тогда тебе один файл-матрешка
incm (2007-12-18 17:43:00) [4]
> Сергей М.
> В дан.случае точно не твое, поскольку оно блокировано ожиданием
> сигнала объекта синхр.ции и не может вернуть ответ на сообщение
> WM_QUERYENDSESSION раньше чем объект просигналит.
Получается что, пока не прийдет ответ от каждого приложения на WM_QUERYENDSESSION винда не закроется ? И не может ли она насильно закрыть по истечении интервала времени так и не получив от всех ответ на WM_QUERYENDSESSION?
> clickmaker
Даты сравниваться будут по любому.
А как запустить файл *.bin? Или только переименовывать ?
clickmaker (2007-12-18 13:47:00) [5]
> [22] incm (18.12.07 12:54)
я бы все-таки написал стартер.
который сначала сравнивает даты бинарника в сети и локального, потом, если надо копирует и запускает.
Для пользователя это будет выглядеть как
YourApp.exe и ярлык к нему - на самом деле стартер
YourApp.bin - сам исполняемый модуль, переименованный экзе
ыы (2007-12-18 13:32:00) [6]if FileExists('project1.old') then DeleteFile('project1.old');
RenameFile('project1.exe', 'project1.old');
CopyFile('c:\updates\project1.exe', 'project1.exe');
WinExec('project1.exe');
Halt;
Сергей М. (2007-12-18 13:07:00) [7]
> Кто тогда первый закроется
В дан.случае точно не твое, поскольку оно блокировано ожиданием сигнала объекта синхр.ции и не может вернуть ответ на сообщение WM_QUERYENDSESSION раньше чем объект просигналит.
incm (2007-12-18 12:54:00) [8]
> Сергей М.
> WaitForSingleObject
Все то хороше, но если начнется выключение компа. Кто тогда первый закроется, мое основное приложение или програмка обновлятель... А будет скорее всего именно так, ибо программа будет висеть у оператора постоянно и закрываться при выключении. Вариант насильно перезапустить не особо подходит - оператор можпет что-то делать в этот момент, а выдавать ему всякие окошки с вопросами - не особо хороше, операторы тупые и действия их малопредсказуемы.
> clickmaker
> то есть? в момент обновления?
> а откуда новая версия скачивается?
В момент, когда основная прога будет еще не закрыта, а обновлялка будет ждать закрытия. Хотя тут еще что-то придумать можно.
Обновляться будет из локалки.
clickmaker (2007-12-18 12:23:00) [9]
> И как обеспечит надежное обновление файла, даже если комп
> резетом перегрузят?
то есть? в момент обновления?
а откуда новая версия скачивается?
Сергей М. (2007-12-18 12:18:00) [10]
> как отследить что завершился процесс
WaitForSingleObject
> как обеспечит надежное обновление файла, ..если комп
> резетом перегрузят
Никак.
incm (2007-12-18 12:16:00) [11]
> Riply
> Вот только не надо сказки рассказывать.
> Бедный заказчик (разбирающийся в алгоритме "самопереписывания")
> запутается с файлом,
> который может и существовать то будет доли секунды ?
Заказчик вовсе не бедный :)
Да и путаться будет не он, а те кто будут с ним работать. Ну и дело тут совсем не в том.
Пусть будет 2 файла, что-то придумаю. Но главное другое - как отследить что завершился процесс, который запустил программу. И как обеспечит надежное обновление файла, даже если комп резетом перегрузят?
incm (2007-12-18 12:16:00) [12]
> Riply
> Вот только не надо сказки рассказывать.
> Бедный заказчик (разбирающийся в алгоритме "самопереписывания")
> запутается с файлом,
> который может и существовать то будет доли секунды ?
Заказчик вовсе не бедный :)
Да и путаться будет не он, а те кто будут с ним работать. Ну и дело тут совсем не в том.
Пусть будет 2 файла, что-то придумаю. Но главное другое - как отследить что завершился процесс, который запустил программу. И как обеспечит надежное обновление файла, даже если комп резетом перегрузят?
Slym (2007-12-18 12:12:00) [13]incm (18.12.07 10:27) [14]
Так хочет заказчик, да бы не путаться
чтоб не путался - расширение основной программы смени например proga.res, остается только 1 запускной лончер run_proga.exe который проверяет версию обновляет и запускает proga.res
slow!alfamoon!com (2007-12-18 11:25:00) [14]Это можно сделать... Но не нужно :)))
Riply (2007-12-18 10:58:00) [15]> [14] incm (18.12.07 10:27)
> Так хочет заказчик, да бы не путаться.
Вот только не надо сказки рассказывать.
Бедный заказчик (разбирающийся в алгоритме "самопереписывания") запутается с файлом,
который может и существовать то будет доли секунды ?
incm (2007-12-18 10:27:00) [16]
> Rouse_
> Зачем?
Так хочет заказчик, да бы не путаться. Конечно можно постараться убедить его в обратном... я сам тоже не вижу смысла в одном файле. Но тогда вопрос, как КОРРЕКТНО дождаться завершения процесса, из которого была вызвана программа ? Нужно что бы обновление прошло ОБЯЗАТЕЛЬНО, что бы не случилось с компом (ну разве что физически он сдохнет :) ).
Rouse_ (2007-12-18 09:00:00) [17]
> Очень желательно все сделать ОДНИМ файлом.
Зачем?
Strate (2007-12-18 08:20:00) [18]Германн © (18.12.07 1:24) [11]
Звиняюсь, немного недописал :)
Тот второй экзешник если к примеру засунуть в ресурсы основного, и при необходимости достать оттуда, записать во внешний файл, а после исполнения им некоторых функций удалить?
Германн (2007-12-18 01:24:00) [19]
> Strate (18.12.07 01:19) [10]
А чем этот вариант отличается от [6.1]?
Strate (2007-12-18 01:19:00) [20]А почему бы не вызвать другой экзешник, который положить рядом с прогой, закрыть себя, а в другом экзешнике подождать немного, перезаписать экзешник, запустить его, закрыть себя?
P.S> Так понимаю обновляццо желаем :)