Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для GBIT
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223

Код для обновления своего .exe на новую версию

12.09.2013, 21:27. Показов 3544. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Раскрываю сабж:
есть программа.exe, она в автозагрузке, она работает,
допустим я пишу новую версию этой программы и теперь мне нужно обновить программу на новую версию .exe,
я даю команду на обновление этой программе, а далее нужна идея как построить алгоритм обновления?

варианта вижу 2:
1й, простой, вариант. (алгоритм и реализация мне ясна)
Кликните здесь для просмотра всего текста
По команде обновиться, запускается другая программа updater.exe,
а обновляемая программа.ехе завершает работу,
updater.exe удаляет программа.ехе,
копирует новую версию программа.ехе, запускает ее,
завершает работу, программа.ехе удаляет updater.exe


2й, непонятный мне в реализации, вариант.
По команде обновиться, программа.ехе по хэндлу как-то должна себя переименовать в программа(old).ехе
скопировать новую версию программа.ехе,
удалить программа(old).ехе,
ждать пока компьютер перезагрузится и с новой загрузкой ОС запустить уже свежую версию.

по 2му варианту у меня вопрос: реализуемо ли такое? как реализовать?

Не по теме:

не нужная инфа: программа обновляется по сети

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2013, 21:27
Ответы с готовыми решениями:

Как не отключая обновления запретить замену ядра на более новую версию?
win xp, sp 3, лицензионка постоянно вылетает бсод на ядро ntoskrnl.exe версии 5.1.2600.6368 , если заменить на более ранюю все окау, но...

Переписать код светофора под новую версию среды
program svetofor; uses graphabc,timers,CRT,events; var sv1,sv2,sv3:Timer; procedure Timerprocext(n:integer); begin if...

Curllib для Си, не могу установить на новую версию MSVS
Господа, уже целую неделю бьюсь, не могу подключить библиотеку curl на Visual studio 2017, на офф сайте не нашёл библиотек dll для vs17, а...

8
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
12.09.2013, 23:44
2-й вар-т вполне реален, есть стандартные функции форточек - ShFileOperation, например (это для решения проблемы автоапдэйта при запуске системы). Только не надо проге саму себя переименовывать. Качаешь newversion, а далее... В Делфи - примерно так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
implementation uses ShellAPI;
 
function Rename_NewFile_To_Himself (
  FileName: string                      // новый файл
): boolean;
var
  fo:TSHFileOpStruct;
begin
  with fo do begin
    wFunc := FO_RENAME;
    pFrom := PChar(FileName); // новая версия файла
    pTo   := PChar(ParamStr(0));        // старый файл, т.е сама прога
    fFlags:=FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
  end;
 
  // не помню кодов возврата, см. Help
 
  Result:=SHFileOperation(fo) = 0 {???} ;
end;
ну и потОм - перезагружай.
0
 Аватар для GBIT
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
13.09.2013, 19:44  [ТС]
ParanoiS, ShFileOperation() решает!
Цитата Сообщение от ParanoiS Посмотреть сообщение
Только не надо проге саму себя переименовывать
попробовал без переименования - ошибка доступа появляется. Вышел из ситуации именно переименованием.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// ShFileOperation()
// [url]http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx[/url]
// SHFILEOPSTRUCT
// [url]http://msdn.microsoft.com/en-us/library/windows/desktop/bb759795(v=vs.85).aspx[/url]
#include <windows.h>
#include <stdio.h>
 
int main()
{
 // rename программы
    SHFILEOPSTRUCT mStruct;
    
    int err=0;
 
    //Дескриптор окна диалогового окна для отображения информации о состоянии операции над файлами
    mStruct.hwnd =                      0;
    //Значение, которое указывает, какую операцию выполнять. Один из следующих значений:
    mStruct.wFunc =                 FO_RENAME;
    //Источник
    mStruct.pFrom =                 L"C:\\ip\\pro\\test.exe";
    //Назначение
    mStruct.pTo =                   L"C:\\ip\\pro\\test(old).exe";
    //Флаги, которые контролируют операции над файлами. Этот элемент может принимать комбинацию из следующих флагов.
    mStruct.fFlags =                    FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI ;
    //
    //myStruct.fAnyOperationsAborted =  
    //После возврата из функции, этот элемент содержит дескриптор объекта отображения имен, содержащий старые и новые названия переименованных файлов.
    mStruct.hNameMappings =         0;
    //указатель на название диалогового окна прогресса. Это строка с завершающим нулем.
    //myStruct.lpszProgressTitle =
 
    err=SHFileOperation(&mStruct);
    printf("err=%i\n",err);
    if(err!=0)
        MessageBox(0,L"Ошибка1",0,0);
    
 
// copy новую версию программы  
    SHFILEOPSTRUCT myStruct;
    
 
 
    //Дескриптор окна диалогового окна для отображения информации о состоянии операции над файлами
    myStruct.hwnd =                     0;
    //Значение, которое указывает, какую операцию выполнять. Один из следующих значений:
    myStruct.wFunc =                    FO_COPY;
    //Источник
    myStruct.pFrom =                    L"C:\\ip\\test.exe";
    //Назначение
    myStruct.pTo =                      L"C:\\ip\\pro\\test.exe";
    //Флаги, которые контролируют операции над файлами. Этот элемент может принимать комбинацию из следующих флагов.
    myStruct.fFlags =                   FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI ;
    //
    //myStruct.fAnyOperationsAborted =  
    //После возврата из функции, этот элемент содержит дескриптор объекта отображения имен, содержащий старые и новые названия переименованных файлов.
    myStruct.hNameMappings =            0;
    //указатель на название диалогового окна прогресса. Это строка с завершающим нулем.
    //myStruct.lpszProgressTitle =
 
    err=SHFileOperation(&myStruct);
    printf("err=%i\n",err);
    if(err!=0)
        MessageBox(0,L"Ошибка2",0,0);
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
06.10.2013, 20:39
Сорри, инета небыло.

На фига?? Ты не понял, ща объясню. Цитирую твой код с изменениями во флагах. Обрати внимание на FOF_RENAMEONCOLLISION.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Дескриптор окна диалогового окна для отображения информации о состоянии операции над файлами
    mStruct.hwnd =                      0;
    //Значение, которое указывает, какую операцию выполнять. Один из следующих значений:
    mStruct.wFunc =                 FO_RENAME /*можно и FO_MOVE*/ ;
    //Источник
    mStruct.pFrom =                 L"C:\\... новая версия ...\\test.exe";
    //Назначение
    mStruct.pTo =                   L"C:\\... старая ...\\test.exe";
    //Флаги, которые контролируют операции над файлами. Этот элемент может принимать комбинацию из следующих флагов.
    mStruct.fFlags =                    FOF_RENAMEONCOLLISION | FOF_NOCONFIRMATION | FOF_SILENT | FOF_NO_UI;
    //
    //myStruct.fAnyOperationsAborted =  
    //После возврата из функции, этот элемент содержит дескриптор объекта отображения имен, содержащий старые и новые названия переименованных файлов.
    mStruct.hNameMappings =         0;
    //указатель на название диалогового окна прогресса. Это строка с завершающим нулем.
    //myStruct.lpszProgressTitle = NULL;
 
    err=SHFileOperation(&mStruct);
После этого должно быть так: заносится запись в реестр (в 9х - в файл) о том что необходимо замениить ЗАНЯТЫЙ файл, тоесть замена произойдёт после перезагрузки (в NT и выше - при входе в аккаунт).

Кста, а чё за ошибка? Возможно, конфликт ANSI/Unicode. Проверил?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
06.10.2013, 21:08
Цитата Сообщение от GBIT Посмотреть сообщение
программа.ехе по хэндлу как-то должна себя переименовать в программа(old).ехе
нехороший вариант. Наверное, реализуемо, но зачем? Надо попроще что-то делать.
0
 Аватар для GBIT
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
06.10.2013, 21:16  [ТС]
Остановился на варианте:
program.exe переименует файл с которого запустилась в program(old).exe
копирует новую версию program.exe
перезагрузка компа
запускается обновленная program.exe
ищет program(old).exe, если есть удаляет его

все на api функциях просто и легко
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
06.10.2013, 21:33
Можно сделать так. Имеем, к примеру programma.exe, которая должна обновляться программой new.exe

По сигналу "обновиться" programma.exe делает следующее:

1) проверяет текущую директорию на наличие файла new.exe. Можно обойтись и без этого шага, но тогда нужно быть уверенным, что файл new.exe ЕСТЬ в текущей директории

2) если new.exe в текущей директории есть, тогда programma.exe должна запустить process.exe Последний может идти отдельным файлом. Но если хочется (я бы так и сделал) файл process.exe может идти секцией к programma.exe

3) programma.exe благополучно заканчивает свою работу.

4) process.exe делает следующее: переименовывает new.exe в programma.exe и самоубивается, перед этим уничтожив файл process.exe. Это тонкое место: на XP такой номер у меня проходил, как на других осях, не знаю. Впрочем, есть вариант: файл process.exe уничтожается программой programma.exe. То есть programma.exe запускается и первое, что делает- проверяет текущую директорию на наличие файла process.exe и в случае наличия последнего удаляет его. Всё.

Добавлено через 1 минуту
Цитата Сообщение от GBIT Посмотреть сообщение
program.exe переименует файл с которого запустилась в program(old).exe
вот это меня интересует. Нельзя ли пример?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
06.10.2013, 21:49
Цитата Сообщение от GBIT Посмотреть сообщение
допустим я пишу новую версию этой программы и теперь мне нужно обновить программу на новую версию .exe
И сразу главный вопрос - как гарантируется, что программа будет иметь
достаточно прав, чтобы перезаписать себя в соответствующей папке ?
Например, доступ в Program Files на запись, куда обычно ставятся программы,
есть только у системы и администраторов. А ставить софт в другие папки,
доступные на запись для юзеров - это значит создавать дыры в системе
безопасности Windows.
0
 Аватар для GBIT
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
07.10.2013, 11:48  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
пример
C++
1
2
3
4
5
char programm[MAX_PATH]="program";
char oldProgramm[MAX_PATH]="program(old)";
 
rename(programm,oldProgramm);
CopyFileA("\\\\192.168.0.1\\lan\\programm.exe",programm,false);
Убежденный, программа валяется в папке документов пользователя, по этому с правами проблем нет. Согласен, что место, мягко говоря, не подходящее для софта. Но программа и не предназначена для пользователя. Она для удаленного администрирования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.10.2013, 11:48
Помогаю со студенческими работами здесь

Как программно нажать клавишу F5 для обновления рабочего стола из своего приложения?
Есть ли метод или функция эмулирующая нажатие клавиши F5 для обновления рабочего стола? Или примерно такой способ, только кодом C#

Как сохранить exe версию для работы программы
Здравствуйте программу заказывал фрилансеру, он все исправно сделал, программа работает, но я хочу сохранить сам, с новым названием (это я...

Перезапуск explorer.exe для обновления области уведомлений
&quot;taskkill /pid 2636&quot; делает не то. &quot;explorer&quot; запускает процесс, но не закрывает окно. &quot;start explorer&quot; или...

Как изменить версию .NET своего решения
Переключил в своем решении требуемую версию .NET на 4.5.1, а ZipFile все равно не могу использовать, подскажите где еще посмотреть

Ln R5 на новую версию Ln R6
Добрый день! После перехода на R6 ночью добавились задачи, которые запускаются сервером. 01:00:58 AM Database Designer started ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru