Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/72: Рейтинг темы: голосов - 72, средняя оценка - 4.67
5 / 5 / 2
Регистрация: 02.01.2011
Сообщений: 64

Обновление программы

19.02.2011, 23:32. Показов 14046. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.. Я хочю сделать сайт или что-то вроде этого, чтобы программа сама обновления скачивала и потом обновляла себя, а не скидывать программу другу каждый раз, когда я в нее добавлю что-то новенькое. Друг посто сможет зайти в настройки программы и там обновить ее. Это как-то возможно вообще? О_о
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2011, 23:32
Ответы с готовыми решениями:

Обновление программы
Программа (prog1.exe) обновляется через интернет или с файла обновления на компьютере. При обновлении,новый файл exe перемещается в папку с...

Обновление программы
Можете подсказать, как реализовать следующее: На диске Yandex лежит файл с обновлением. Если дата создания данного файла младше даты...

Как сделать обновление программы
Ребят у меня такой вопрос как сделать , есть программа такая простенькая , как сделать так что бы она по нажатию кнопки обновлялась, как бы...

26
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.02.2011, 00:18
Обновление программы через Интернет

Программа (prog1.exe) обновляется через интернет или с файла обновления на компьютере. При обновлении,новый файл exe перемещается в папку с prog1.exe, перемещенному файлу присваивается имя prog2.exe, prog1.exe запускает prog2.exe и закрывается, а prog2.exe при открытии удаляет prog1.exe,и переименовывает себя в prog1.exe
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
   {
  AnsiString ProgramFileName=ExtractFilePath(Application->ExeName);//при открытии приложения 
  AnsiString PFN1=ProgramFileName+"Prog1.exe"; //проверка на наличие старой версии и ее удаление
  AnsiString PFN2=ProgramFileName+"Prog2.exe";
  if((FileExists(PFN1.c_str())) && (FileExists(PFN2.c_str())))
    DeleteFile(PFN1.c_str());
  MoveFile(PFN2.c_str(),PFN1.c_str());
   }
 
AnsiString T=ExtractFilePath(Application->ExeName)+"Prog2.exe";// при обновлении через 
  NMHTTP1->Body=T; //интернет
  ShellExecute(0,0,T.c_str(),0,0,SW_SHOW);
  Close();
 
AnsiString S=ExtractFilePath(Application->ExeName)+"Prog2.exe"; //при обновлении через файл
  CopyFile(OpenDialog1->FileName.c_str(),S.c_str(),true); //на компьютере
  ShellExecute(0,0,S.c_str(),0,0,SW_SHOW);
  Close();
Проблема такая: когда обновляешь с файла на компьютере до ,скажем, версии 7.0,выключаешь программу,затем запускаешь снова, обновляешь через интернет до версии 8.0 все работает хорошо,но когда не завершаешь программу после того как обновил ее до версии 7.0, а тут же начинаешь обновлять до версии 8.0 программа начинает скачивать файл обновлений, но не в папку c программой,а в папку в которой был файл обновления до версии 7.0.Помогите, пожалуйста!

Код которым качаем с инета.
C++
1
2
3
4
NMHTTP1->InputFileMode=true;
   AnsiString T=ExtractFilePath(Application->ExeName)+"Prog2.exe";
   NMHTTP1->Get("http://lya-lya-lya.narod2.ru/newvers.exe");
   NMHTTP1->Body=T;
Только я не понимаю зачем он вам,так как часть из него,относящуюся к данной проблеме я уже привел.
Почитал,спасибо,но принципиальной разницы не увидел, так как они дадут тот же самый результат, что и ExtractFilePath(Application->ExeName). Тем более, что если он начинает качать в папку,из которой было произведено обновление на компьютере,логично предположить,что программа запущена оттуда,но отладчик показывает,что все ссылки корректны.

Вот, норм работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  try
  {
    AnsiString OldFile = Application->ExeName;
    AnsiString TempFile = ExtractFilePath(Application->ExeName) + "proga.exe.temp";
    TIdHTTP *DownLoad = new TIdHTTP(Form1);
    TFileStream *FileStream = new TFileStream(TempFile, fmCreate|fmOpenWrite);
    DownLoad->Get("http://gremlin-files.narod.ru/proga.exe", FileStream);
    delete FileStream;
    delete DownLoad;
    RenameFile(OldFile, ExtractFilePath(TempFile) + "old.bak"); // или удалить
    RenameFile(TempFile, OldFile);
    // ShellExecute ... 
    Form1->Close();
  }
  catch(...)
  {
    //
  }
хм... похоже тебе нужно так да:
V6 обновояется до V7
V7 обновояется до V8
C++
1
2
3
4
5
6
7
8
9
AnsiString OldFile = Application->ExeName; //ваш код
AnsiString TempFile = ExtractFilePath(Application->ExeName) + "proga.exe.temp";
TIdHTTP *DownLoad = new TIdHTTP(Form1);
TFileStream *FileStream = new TFileStream(TempFile, fmCreate|fmOpenWrite);
 
NMHTTP1->InputFileMode=true; //мой код
AnsiString T=ExtractFilePath(Application->ExeName)+"Prog2.exe";
NMHTTP1->Get("http://lya-lya-lya.narod2.ru/newvers.exe");
NMHTTP1->Body=T;
Команды разные,а суть одна.А ошибка идет именно здесь (начинается скачка в не ту папку). Я ещё раз повторюсь,что и мой код работает,но только при одном обновлении за сессию (не важно откуда обновление)
C++
1
2
SetCurrentDir(ExtractFilePath(Application->ExeName);
NMHTTP1->Get("http://lya-lya-lya.narod2.ru/newvers.exe");
Заменил везде команды типа
C++
1
2
3
4
5
AnsiString 
T=ExtractFilePath(Application->ExeName)+"Prog2.exe";
 
SetCurrentDir(ExtractFilePath(Application->ExeName);
T=Prog2.exe;
и стало работать. А вы не могли бы объяснить почему так происходило,дело все в том,что когда я смотрел значение строки T- оно указывало путь в нужную папку,а не в папку с обновлением,а скачивалось все равно в папку с обновлением?
Источник не помню.
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
20.02.2011, 09:57
Лучший ответ Сообщение было отмечено как решение

Решение

На сайт заливаешь файл Update.inf со следующим содержимым:
[Info]
Update Version = 1.1
Update File = http://site.com/Program.exe
Update Changes = Пофиксены баги
Затем когда нужно проверить обновления, скачиваешь этот Update.inf с сайта.
С помощью TMemIniFile считываешь значение параметра Update Version и сверяешь с текущей. Если Update Version больше, чем текущий, то отображаешь диалог: "Обновить программу? Изменения в текущей версии:... Да\Нет". Если нажимают "Да", то прога скачивает файл по ссылке, указанной в параметре Update File. По завершении скачивания закрываешь прогу и запускаешь новую версию, обычно это делается так:
1. выполняешь следующее:
C++
1
2
3
#include "process.h"
...
WinExec( ((AnsiString)getenv("COMSPEC") + " /c ping -n 2 localhost > nul & Start \"\" \"C:\\program.exe\"").c_str() , SW_HIDE)
2. выходишь из программы
Через секунду будет запущена новая версия.

Можно ещё сделать так, чтобы текущая версия была перезаписана новой версией. Сделать можно так:
C++
1
WinExec( ((AnsiString)getenv("COMSPEC") + " /c ping -n 2 localhost > nul & Move /y \"C:\\Temp\\Program.exe\" \"C:\\Program.exe\" & Start \"\" \"C:\\program.exe\"").c_str() , SW_HIDE)
8
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.02.2011, 10:49
1. Затем когда нужно проверить обновления, скачиваешь этот Update.inf с сайта.
2. С помощью TMemIniFile считываешь значение параметра Update Version и сверяешь с текущей. Если Update Version больше, чем текущий, то отображаешь диалог: "Обновить программу? Изменения в текущей версии:... Да\Нет". Если нажимают "Да", то
3. прога скачивает файл по ссылке, указанной в параметре Update File.
- неплохо бы это расписать поподробнее - с примером кода .
0
5 / 5 / 2
Регистрация: 02.01.2011
Сообщений: 64
20.02.2011, 13:45  [ТС]
Буду пробовать =)

Добавлено через 41 минуту
Компонент TidHTTP я выложил на форму, вставил ваш код для скачивания файла с интернета
C++
1
2
3
4
NMHTTP1->InputFileMode=true;
   AnsiString T=ExtractFilePath(Application->ExeName)+"Prog2.exe";
   NMHTTP1->Get("http://lya-lya-lya.narod2.ru/newvers.exe");
   NMHTTP1->Body=T;
но его пришлось изменить на этот
C++
1
2
3
4
IdHTTP1->InputFileMode=true;
   AnsiString T=ExtractFilePath(Application->ExeName)+"Prog2.exe";
   IdHTTP1->Get("http://lya-lya-lya.narod2.ru/newvers.exe");
   IdHTTP1->Body=T;
потому что возникли вот такие ошибки
[BCC32 Error] Unit1.cpp(20): E2451 Undefined symbol 'NMHTTP1'
когда я заменил код, то опять возникли ошибки, но уже другие:
[BCC32 Error] Unit1.cpp(20): E2316 'InputFileMode' is not a member of 'TIdHTTP'
[BCC32 Error] Unit1.cpp(23): E2316 'Body' is not a member of 'TIdHTTP'
видимо у моего компонента нет таких функций)
что подскажите?
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.02.2011, 13:51
версия Билдера какая ?
0
5 / 5 / 2
Регистрация: 02.01.2011
Сообщений: 64
20.02.2011, 13:52  [ТС]
Embarcadero RAD Studio XE
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.02.2011, 14:19
A если поставить CppWebBrowser или просто WebBrowser ?
0
5 / 5 / 2
Регистрация: 02.01.2011
Сообщений: 64
20.02.2011, 14:26  [ТС]
LK, какая у Вас версия билдера? Давайте я ее установлю и попробую там скомпилировать
P.S. проблем то меньше будет
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.02.2011, 14:43
1. Rad XE
2. Я привел пример кода, а не свой код.

Добавлено через 2 минуты
Все упирается в скачивание файла, я так понял, как єто сделать по другому , можно посмотреть здесь : Получение форматированной HTML-страницы
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
25.02.2011, 09:32
Цитата Сообщение от LK Посмотреть сообщение
- неплохо бы это расписать поподробнее - с примером кода .
Решил не расписывать, а написать простенький модуль обновления (во вложении).

Для его подключения, нужно распаковать архив в проект, затем в проекте нажать Проект->Добавить к проекту->выбрать UpdateModule.cpp. В Unit1.cpp добавить #include "UpdateModule.h"

Использование модуля в проекте:
В любом месте кода вызвать метод CheckUpdate, например, по нажатию кнопки:
C++
1
UpdateModule->CheckUpdate(sCurrentVersion, sURLinf, bShowError, bAutoRenameToExe, bBlockForms);
где sCurrentVersion - текущая версия программы,
sURLinf - ссылка на Update.inf, находящемся на хостинге и имеющим следующий вид, как пример:
[Info]
Update Version = 1.1
Update File = http://site.com/MyProgram/MyProgramm1.1.efe
Update Changes = Исправлена куча багов
bShowError - если поставить в false, то CheckUpdate будет вызвана в silent режиме, т.е. никаких мессагов с ошибками не будет отображено, а также не будет отображено сообщение в случае, когда у вас стоит последняя версия. полезно ставить в false, когда CheckUpdate вызывается сразу при запуске программы. (по умолчанию: true)
bAutoRenameToExe - если стоит true, то после скачивания новой версии программы, файлу будет изменено расширение на .exe. Опция решает проблему с ucoz'ом. (по умолчанию: true)
bBlockForms - если стоит true, то во время загрузки обновления будут заблокированы формы проекта (по умолчанию: true)

Особенности модуля:
проверка и загрузка обновления происходит в потоке.
работает в Builder 6 и в Builder XE.
защита от одновременного вызова CheckUpdate
отображается прогресс скачивания обновления
программа ловит и отображает различные ошибки (на русском языке), которые могут возникнуть при вызове CheckUpdate
по окончанию загрузки обновления будет завершено выполнение текущей версии программы и запущена новая версия.
если название выполняемого файла на хостинге совпадает с тем, что в проекте, то текущая версия будет перезаписана новой версией.

Добавил пример проекта (во вложении).
Вложения
Тип файла: zip UpdateModule.zip (3.9 Кб, 202 просмотров)
Тип файла: rar Пример проекта.rar (20.6 Кб, 181 просмотров)
3
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
25.02.2011, 10:34
чтобы работал в Rad Studio XE, нужно _TCHAR maps to установить в char
1
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 10
05.11.2011, 20:49
Подскажите пожалуйста я всё делаю как надо а у меня возникает ошибки

0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
06.11.2011, 14:44
проблема в indy. когда делал этот модуль, ставил на 6-ю версию билдера 10 версию indy (по умолчанию стоит 8 версия). тип последнего параметра у методов IdHTTPUpdateWorkBegin, IdHTTPUpdateWork в 10-й версии изменился на __int64, в предыдущих версиях был const int.
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
06.11.2011, 15:36
Лучший ответ Сообщение было отмечено как решение

Решение

Обновил архивы.
Для тех, у кого стоит Indy10 придется заглянуть UpdateModule.cpp, там будет в самом верху кое-что написано, иначе будут ошибки при компиляции. К сожалению, не знаю как сделать так, чтобы этого не приходилось делать.
Вложения
Тип файла: zip Пример проекта.zip (28.3 Кб, 159 просмотров)
Тип файла: zip UpdateModule.zip (4.0 Кб, 169 просмотров)
4
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 10
08.11.2011, 04:51
Подскажите что делать возникает вот такая ошибка

0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.11.2011, 05:10
когда - в какой ситуации - возникает? к какой строке кода относится ?
2
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 10
08.11.2011, 07:31
Вот



Добавлено через 2 часа 6 минут
всё я сделал это просто глюк был вот и всё я перезапустил и всё норм стало

 Комментарий модератора 
Перемещено в новую тему: Ошибка при запуске программы - vcl60.bpl не был найден :
Правила
п.2.4. На каждый вопрос создавайте по одной теме - это помогает избежать путаницы в ответах и облегчает поиск.
m9IsKo, для вложений используйте встроенные возможности форума - кнопка "Расширенный режим-Управление вложениями" - внизу окна редактирования сообщения !
0
32 / 29 / 12
Регистрация: 04.03.2013
Сообщений: 895
11.07.2013, 20:37
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Обновил архивы.
Для тех, у кого стоит Indy10 придется заглянуть UpdateModule.cpp, там будет в самом верху кое-что написано, иначе будут ошибки при компиляции. К сожалению, не знаю как сделать так, чтобы этого не приходилось делать.
у меня вопрос по вашему модулю, который оформил в Ошибка: Проверьте интернет-соединение
Если не сложно, помогите, пожалуйста
0
32 / 29 / 12
Регистрация: 04.03.2013
Сообщений: 895
13.07.2013, 12:04
появляется сообщение при работе модуля:
"Информация об обновлении на сервере - некорректна."
Что может быть не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.07.2013, 12:04
Помогаю со студенческими работами здесь

Некорректное обновление программы на клиентской рабочей станции
Ребята очень нужна Ваша помощь! Разрабатываю программу обновления ПО. На компьютере где я ее запускаю у пользователя отсутствуют...

Автоматическое обновление данных ADOTable при добавлении данных другим экземляром программы
С моей программой работает около 3-4 экземляров программы. Одна таблица работает с помощью ADOTable. В ней постоянно обновляемые данные. ...

Обновление программы
Привет всем. Помоги составить алгоритм по которому будет обновляться программа) чтото вобще не могу представить как это делается) ...

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

Обновление программы
Как сделать обновление программы на C#. Допустим я программу эту положу на сервер, этой программой будут пользоваться работники и к примеру...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru