Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как исполняемому файлу перезаписать самого себя ? [D7, Win2k, WinXP]


Страницы:   1 2

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> Так понимаю обновляццо желаем :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо