Конференция "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 файла, что-то придумаю. Но главное другое - как отследить что завершился процесс, который запустил программу. И как обеспечит надежное обновление файла, даже если комп резетом перегрузят?
 
Конференция "WinAPI" » Как исполняемому файлу перезаписать самого себя ? [D7, Win2k, WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]