Конференция "WinAPI" » Как исполняемому файлу перезаписать самого себя ? [D7, Win2k, WinXP]
 
  • incm (17.12.07 17:39) [0]
    Нужно программе которая в данный момент выполняется, заменить свой собственный *.exe файл.
  • Leonid Troyanovsky © (17.12.07 17:48) [1]

    > incm   (17.12.07 17:39)  

    > Нужно программе которая в данный момент выполняется

    Вовсе это ей не нужно.

    --
    Regards, LVT.
  • DeBUGger13 (17.12.07 17:57) [2]
    Нельзя :(
    Виндовоз не позволит(скажет ай-ай-ай, мол , и не даст доступ к исполняемому EXE-шнику).
  • incm (17.12.07 18:12) [3]

    > Leonid Troyanovsky


    > Вовсе это ей не нужно.

    Очень даже нужно. Версию поменять.


    > DeBUGger13


    > Нельзя :(
    > Виндовоз не позволит(скажет ай-ай-ай, мол , и не даст доступ
    > к исполняемому EXE-шнику).

    Если бы все было так просто, то и не спрашивал бы. Но решение быть должно, винда то себя как то обновляет. Меня устроил бы вариант, что я копирую куда то файл на который надо заменить, а после того как прога будет закрыта, винда этим файлом подменит старый. Но нужно что бы подменяла при любых обстоятельствах, даже если ее резетом перезагрузят, то всеравно после загрузки она должна сделать это.
  • {RASkov} © (17.12.07 18:23) [4]
    > [3] incm   (17.12.07 18:12)
    > Версию поменять.

    Здесь можно несколько вариантов придумать....
    Но замена работающего екзэшника - это не верно и не нужно...

    Например, сделай модуль(отдельное приложение) отвечающий за обновление программы, в задачах которого будет завершение работы обновляемой программы, замены екзэшника, запуск новой версии....

    Если закрытие программы не допустимо, то тут изначально нужно было делать не одним файлом, а несколькими(dll,bpl). И по мере обновления менять отдельные модули....
  • Rouse_ © (17.12.07 18:24) [5]

    > Очень даже нужно. Версию поменять.

    А использовать инсталятор религия не позволяет?
  • clickmaker © (17.12.07 18:29) [6]

    > [3] incm   (17.12.07 18:12)

    1. запускаем exe
    2. смотрим, есть ли новая версия (на шаре, на фтп, ...)
    3. если есть, запускаем другой экзе или батник, который забирает версию. Основной экзе при этом закрывается
    4. другой экзе или батник, скачав свежак, запускает его

    это один вариант

    другой вариант - программа-стартер, которая следит за свежестью версии, скачивает и запускает основной экзе. Ярлык юзера, конечно, должен указывать на этот стартер
  • incm (17.12.07 19:05) [7]
    Очень желательно все сделать ОДНИМ файлом.
    Инсталятор тоже не подходит, все должно само обновляться.

    ЗЫ.
    Все же как винда после перезагрузки перезаписывает свои файлы?
    Мне подходит вариант обновление моего файла после перезагрузки, но без дополнительных модулей.
  • Джо © (17.12.07 19:08) [8]
    > [7] incm   (17.12.07 19:05)
    > Мне подходит вариант обновление моего файла после перезагрузки,
    > но без дополнительных модулей.

    1. MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT.
    2. Записать в реестр в раздел RunOnce ссылку на коммандный процессор с соответствующими параметрами.
  • clickmaker © (17.12.07 19:14) [9]
    лучше уж ОДИН доп. модуль, чем лишняя перезагрузка... Зачем она нужна, если системные компоненты не затрагиваются?
  • Strate (18.12.07 01:19) [10]
    А почему бы не вызвать другой экзешник, который положить рядом с прогой, закрыть себя, а в другом экзешнике подождать немного, перезаписать экзешник, запустить его, закрыть себя?

    P.S> Так понимаю обновляццо желаем :)
  • Германн © (18.12.07 01:24) [11]

    > Strate   (18.12.07 01:19) [10]

    А чем этот вариант отличается от [6.1]?
  • Strate (18.12.07 08:20) [12]
    Германн ©   (18.12.07 1:24) [11]

    Звиняюсь, немного недописал :)

    Тот второй экзешник если к примеру засунуть в ресурсы основного, и при необходимости достать оттуда, записать во внешний файл, а после исполнения им некоторых функций удалить?
  • Rouse_ © (18.12.07 09:00) [13]

    > Очень желательно все сделать ОДНИМ файлом.

    Зачем?
  • incm (18.12.07 10:27) [14]

    > Rouse_


    > Зачем?


    Так хочет заказчик, да бы не путаться. Конечно можно постараться убедить его в обратном... я сам тоже не вижу смысла в одном файле. Но тогда вопрос, как КОРРЕКТНО дождаться завершения процесса, из которого была вызвана программа ? Нужно что бы обновление прошло ОБЯЗАТЕЛЬНО, что бы не случилось с компом (ну разве что физически он сдохнет :) ).
  • Riply © (18.12.07 10:58) [15]
    > [14] incm   (18.12.07 10:27)
    > Так хочет заказчик, да бы не путаться.

    Вот только не надо сказки рассказывать.
    Бедный заказчик (разбирающийся в алгоритме "самопереписывания") запутается с файлом,
    который может и существовать то будет доли секунды ?
  • slow!alfamoon!com (18.12.07 11:25) [16]
    Это можно сделать... Но не нужно :)))
  • Slym © (18.12.07 12:12) [17]
    incm   (18.12.07 10:27) [14]
    Так хочет заказчик, да бы не путаться

    чтоб не путался - расширение основной программы смени например proga.res, остается только 1 запускной лончер run_proga.exe который проверяет версию обновляет и запускает proga.res
  • incm (18.12.07 12:16) [18]

    > Riply


    > Вот только не надо сказки рассказывать.
    > Бедный заказчик (разбирающийся в алгоритме "самопереписывания")
    > запутается с файлом,
    > который может и существовать то будет доли секунды ?


    Заказчик вовсе не бедный :)
    Да и путаться будет не он, а те кто будут с ним работать. Ну и дело тут совсем не в том.

    Пусть будет 2 файла, что-то придумаю. Но главное другое - как отследить что завершился процесс, который запустил программу. И как обеспечит надежное обновление файла, даже если комп резетом перегрузят?
  • incm (18.12.07 12:16) [19]

    > Riply


    > Вот только не надо сказки рассказывать.
    > Бедный заказчик (разбирающийся в алгоритме "самопереписывания")
    > запутается с файлом,
    > который может и существовать то будет доли секунды ?


    Заказчик вовсе не бедный :)
    Да и путаться будет не он, а те кто будут с ним работать. Ну и дело тут совсем не в том.

    Пусть будет 2 файла, что-то придумаю. Но главное другое - как отследить что завершился процесс, который запустил программу. И как обеспечит надежное обновление файла, даже если комп резетом перегрузят?
  • Сергей М. © (18.12.07 12:18) [20]

    > как отследить что завершился процесс


    WaitForSingleObject


    > как обеспечит надежное обновление файла, ..если комп
    > резетом перегрузят


    Никак.
  • clickmaker © (18.12.07 12:23) [21]

    > И как обеспечит надежное обновление файла, даже если комп
    > резетом перегрузят?

    то есть? в момент обновления?
    а откуда новая версия скачивается?
  • incm (18.12.07 12:54) [22]

    > Сергей М.



    > WaitForSingleObject


    Все то хороше, но если начнется выключение компа. Кто тогда первый закроется, мое основное приложение или програмка обновлятель... А будет скорее всего именно так, ибо программа будет висеть у оператора постоянно и закрываться при выключении. Вариант насильно перезапустить не особо подходит - оператор можпет что-то делать в этот момент, а выдавать ему всякие окошки с вопросами - не особо хороше, операторы тупые и действия их малопредсказуемы.


    > clickmaker


    > то есть? в момент обновления?
    > а откуда новая версия скачивается?

    В момент, когда основная прога будет еще не закрыта, а обновлялка будет ждать закрытия. Хотя тут еще что-то придумать можно.
    Обновляться будет из локалки.
  • Сергей М. © (18.12.07 13:07) [23]

    > Кто тогда первый закроется


    В дан.случае точно не твое, поскольку оно блокировано ожиданием сигнала объекта синхр.ции и не может вернуть ответ на сообщение WM_QUERYENDSESSION раньше чем объект просигналит.
  • ыы (18.12.07 13:32) [24]
    if FileExists('project1.old') then DeleteFile('project1.old');
    RenameFile('project1.exe', 'project1.old');
    CopyFile('c:\updates\project1.exe', 'project1.exe');
    WinExec('project1.exe');
    Halt;
  • clickmaker © (18.12.07 13:47) [25]

    > [22] incm   (18.12.07 12:54)

    я бы все-таки написал стартер.
    который сначала сравнивает даты бинарника в сети и локального, потом, если надо копирует и запускает.
    Для пользователя это будет выглядеть как
    YourApp.exe и ярлык к нему - на самом деле стартер
    YourApp.bin - сам исполняемый модуль, переименованный экзе
  • incm (18.12.07 17:43) [26]

    > Сергей М.



    > В дан.случае точно не твое, поскольку оно блокировано ожиданием
    > сигнала объекта синхр.ции и не может вернуть ответ на сообщение
    > WM_QUERYENDSESSION раньше чем объект просигналит.


    Получается что, пока не прийдет ответ от каждого приложения на WM_QUERYENDSESSION винда не закроется ? И не может ли она насильно закрыть по истечении интервала времени так и не получив от всех ответ на WM_QUERYENDSESSION?


    > clickmaker

    Даты сравниваться будут по любому.
    А как запустить файл *.bin? Или только переименовывать ?
  • MetalFan © (18.12.07 18:21) [27]
    а если "обновлятель" в ресурсы зашить и при необходимости из ресурсов доставать?
    будет тогда тебе один файл-матрешка
  • MetalFan © (18.12.07 18:21) [28]

    > Strate   (18.12.07 08:20) [12]

    сорь, не заметил поста
  • clickmaker © (18.12.07 18:38) [29]

    > А как запустить файл *.bin? Или только переименовывать ?

    CreateProcess
 
Конференция "WinAPI" » Как исполняемому файлу перезаписать самого себя ? [D7, Win2k, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]