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

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

12.09.2013, 21:27. Показов 3600. Ответов 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,705
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,705
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru