Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > перезапуск программы


Автор: admsasha 24.1.2012, 03:37
Есть программа, которая автоматически обновляется и требуется сделать её самоперезапуск.

Я попробовал через system(), под linux, вроде как, проблем нет. А вот под windows создается консольное окно, которое не закрывается даже после выхода из программы. Какие еще способы есть, либо какой выход из этого есть ?

Автор: borisbn 24.1.2012, 09:06
Под Windows есть как минимум 3 варианта:
1) system( "start prog_name.exe" );
2) http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx( ... );
3) http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx( ... );

Автор: admsasha 24.1.2012, 09:12
borisbn, спасибо, попробую.

Автор: xvr 24.1.2012, 11:11
Под Windows есть засада - вы не сможете переписать исполняемый файл программы пока она работает. Если у вас система обновления и сама программа одно и то же, то будут проблемы  smile Решается через создание временного .bat файла, который копирует новый образ поверх старого, удаляет себя и запускает обновленную программу

Автор: 500mhz 24.1.2012, 11:27
Цитата

Решается через создание временного .bat файла, который копирует новый образ поверх старого, удаляет себя и запускает обновленную программу

не красивое решение )

из "учебника"

Цитата

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session
Создайте новое значение, используя следующую информацию:
Имя значения: PendingFileRenameOperations Тип данных: REG_MULTI_SZ Значение: \ ГК\c:\temp\win32k.sys !\??\c:\winnt\system32\win32k.s
Обратите внимание, что значение параметра введено на две строки.


делаем ребут

Автор: borisbn 24.1.2012, 11:37
Цитата(500mhz @  24.1.2012,  11:27 Найти цитируемый пост)
делаем ребут

500mhz, ребут программы или системы ?
Если второе, то скажите, только честно, Вам нравятся программы, которые требуют ребута системы ?

Автор: 500mhz 24.1.2012, 11:56
borisbn
системы ребут.

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

Автор: xvr 24.1.2012, 13:38
Цитата(500mhz @  24.1.2012,  11:56 Найти цитируемый пост)
запущеный ехе скопирует себя с нужным именем. 

Он не сможет себя удалить, в отличие от батника

Автор: 500mhz 24.1.2012, 13:48
xvr
ну может я сумбурно написал
имеем процесс 1.ехе, он скачивает 2.ехе
процесс 1.ехе запускает 2.ехе и завершается
2.ехе копирует себя как 1.ехе

Автор: Sahab 24.1.2012, 13:56
и после этого процесс 1.exe удаляет файл 2.ехе... 
имхо с батником попроще вроде выходит....

Автор: 500mhz 24.1.2012, 14:10
Sahab
на вкус и цвет все фломастеры разные )))

Автор: Sahab 24.1.2012, 14:37
согласен)

Автор: xvr 24.1.2012, 17:22
Цитата(500mhz @  24.1.2012,  13:48 Найти цитируемый пост)
2.ехе копирует себя как 1.ехе 

А кто сотрет 2.exe ?

Автор: bsa 24.1.2012, 17:36
Вообще-то, система не запрещает переименовывать исполняющиеся файлы. Таким образом алгоритм меняется на:
1.exe загружает 2.exe
1.exe переименовывает 1.exe в 1.old
1.old переименовывает 2.exe в 1.exe
1.old запускает 1.exe (как вариант, со специальным параметром)
1.exe ждет пока 1.old завершит работу
1.old завершает работу
1.exe удаляет 1.old

есть второй вариант:
1.exe загружает 2.exe
1.exe запускает 2.exe
1.exe завершает работу
2.exe переименовывает 1.exe в 1.old
2.exe переименовывает 2.exe в 1.exe

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)