Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249

Как реализовать запрос программы на наличие обновлений?

07.11.2014, 10:22. Показов 3607. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу в программу добавить функцию запроса наличия обновлений. Вообще пока не представляю как это делается. Подскажите направление поисков. Хотелось бы, чтобы программа умела не только узнавать о наличии обновлений, но и скачивать это самое обновление.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.11.2014, 10:22
Ответы с готовыми решениями:

Как реализовать в отдельном потоке проверку обновлений при старте программы
Приветствую всех! Возникла необходимость при старте приложения проверять на сайте наличие обновлений, за это отвечает следующий код: ...

Сделать апдейтер, который при запуске программы проверяет наличие обновлений
Хочу сделать апдейтер который при запуске программы проверяет наличие обновлений и если таковые есть, то обновляет. Так вот если у...

Проверка обновлений программы при запуске и запрос на это самое обновление
подскажите пожалуйста, как реализовать следующие функции в программе: 1. Мини-чат ( небольшое окошечко , где можно было бы пообщаться....

23
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
07.11.2014, 10:37
Я сделал так:
1. Ищу у себя на сайте по спецссылочке файлик, к примеру www.site.ru/update/upd.txt
2. Считываю его и анализирую инфу. В нем находится такая примерно инфа:
my.exe =1.0.1.2
upd.exe=1.0.1.0
mydll.dll=1.0.0.0
3. Сравниваю версии установленных файлов и предложенных.
4. Если надо - скачиваю во временную папку оттуда же (www.site.ru/update/*.*)
5. Запускаю апдейтер (утилитка копирования в нужные места новых файлов), она запускается с админправами и выхожу с основной программы.
6. Апдейтер после распихивания файлов запускает основную программу.
1
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
07.11.2014, 11:07  [ТС]
krv, я никогда не занимался реализацией скачивания файлов, поэтому собственно вопрос - а как это решается средствами Builder'а?

Добавлено через 8 минут
И еще родился вопрос. А можно ли по запросу на сервер получать от него только ответ в виде строки, а не скачивать файл с актуальными версиями?
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
07.11.2014, 11:15
В блоге у уважаемого Avazart описана работа с Indy

Можно, если на сервере напишешь скрипт, отдающий этот ответ.
1
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
07.11.2014, 11:46  [ТС]
А где лучше хранить данные о текущей версии программы? Вот у меня, например, в составе программы есть база данных *.mdb, которую я планирую тоже обновлять. Держать где-то в текстовом файле актуальную версию? Как-то не надежно. Вдруг случайно текстовый файлик с текущей версией будет удален.
0
4 / 4 / 1
Регистрация: 06.05.2013
Сообщений: 86
07.11.2014, 11:48
Храните этот файлик в exe
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
07.11.2014, 11:52
Project->Option->Version Info
галочка "Include version information in project"
И процедура вытаскивания версии
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
String GetVersionExe()
{
   LPTSTR lpszFilePath = Application->ExeName.c_str();
   DWORD dwDummy;
   DWORD dwFVISize = GetFileVersionInfoSize( lpszFilePath , &dwDummy );
 
   LPBYTE lpVersionInfo = new BYTE[dwFVISize];
 
   GetFileVersionInfo( lpszFilePath , 0 , dwFVISize , lpVersionInfo );
 
   UINT uLen;
   VS_FIXEDFILEINFO *lpFfi;
 
   VerQueryValue( lpVersionInfo , L"\\" , (LPVOID *)&lpFfi , &uLen );
 
   DWORD dwFileVersionMS = lpFfi->dwFileVersionMS;
   DWORD dwFileVersionLS = lpFfi->dwFileVersionLS;
 
   delete [] lpVersionInfo;
 
   DWORD dwLeftMost     = HIWORD(dwFileVersionMS);
   DWORD dwSecondLeft   = LOWORD(dwFileVersionMS);
   DWORD dwSecondRight  = HIWORD(dwFileVersionLS);
   DWORD dwRightMost    = LOWORD(dwFileVersionLS);
   return IntToStr((int)dwLeftMost)+"."+IntToStr((int)dwSecondLeft)+"."+
                       IntToStr((int)dwSecondRight)+"."+IntToStr((int)dwRightMost);
}
1
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
07.11.2014, 12:50
Номер текущей версии можно хранить в каком-нибудь Label-е программы.
Проще вытащить инфу. Хотя можно забыть обновить значение (так же как и в Version info) при "изменениях" функционала программы.
Однако лучше все-таки брать данные из Version info (так, полагаю, правильней).

Цитата Сообщение от Нитонисе Посмотреть сообщение
я никогда не занимался реализацией скачивания файлов, поэтому собственно вопрос - а как это решается средствами Builder'а?
Достаточно просто. И желательно делать это через поток (Thread), чтобы не было подвисания формы при загрузке.
Например, так:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall MyThread::Execute()
{
    //---- Place thread code here ----
  char szPath[MAX_PATH];
  GetModuleFileName(NULL, szPath, MAX_PATH);
  SetCurrentDir(ExtractFilePath(szPath));
  TFileStream* fs = new TFileStream("myProgram.exe", FileCreate(""));
  HTTP->Get(Label->Caption, fs);  // в Label находится адрес скачиваемого файла
  delete fs;
}
Для указания (установки) текущей директории будет полезным и
C++
1
ParamStr(0);  // возвращает путь и имя исполняемой программы
При желании можно и прогресс скачивания "прикрутить".
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
void __fastcall TForm1::HTTPWork(TObject *ASender, TWorkMode AWorkMode,
      int AWorkCount)
{
  ProgressBar1->Position = AWorkCount;
  CGauge1->Progress = 100*AWorkCount/ProgressBar1->Max;
  Label1->Caption = " Прогресс загрузки, байт: " + FormatFloat("### ### ###", ProgressBar1->Position) + " / " + FormatFloat("### ### ###", ProgressBar1->Max);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::HTTPWorkBegin(TObject *ASender, TWorkMode AWorkMode,
      int AWorkCountMax)
{
  ProgressBar1->Position = 0;
  CGauge1->Progress = 0;
  Label1->Caption = " Прогресс загрузки, байт: 0 / 0";
  ProgressBar1->Max = AWorkCountMax;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::HTTPWorkEnd(TObject *ASender, TWorkMode AWorkMode)
{
  if (CGauge1->Progress >= 100)
  {
    MessageBox(FindWindow("TForm1", "Ultra Mega Super Updater"), "Загрузка успешно завершена.\n\nЗакройте Updater для запуска программы.", "Сообщение", MB_OK + MB_ICONINFORMATION + MB_TASKMODAL);
  }
  else
  {
    MessageBox(FindWindow("TForm1", "Ultra Mega Super Updater"), "Загрузка прервана.\n\nЗакройте Updater и попробуйте повторить операцию либо скачайте обновление вручную.", "Ошибка", MB_OK + MB_ICONERROR + MB_TASKMODAL);
    ProgressBar1->Position = 0;
    CGauge1->Progress = 0;
    Label1->Caption = " Прогресс загрузки, байт: 0 / 0";
  }
}
1
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
07.11.2014, 13:01
Цитата Сообщение от gunslinger Посмотреть сообщение
Номер текущей версии можно хранить в каком-нибудь Label-е программы.
Проще вытащить инфу. Хотя можно забыть обновить значение (так же как и в Version info) при "изменениях" функционала программы.
Ну в настройках проекта, там же - есть пункт Build number options==Autoincrement build number (в старых версиях это просто чекбокс)
Ну и разрабатывать программу без контроля версий - не комильфо совсем.

Не по теме:

Года через два звонит клиент "а у меня вот тут не работает, помогите спасите и платите неустойку!"
А вы так "а у вас версия 1.0.0.1, а мы давно выпустили 1.0.0.2 с новым функционалом, платите тыщщу рупий и работайте дальше без глюков"


А без контроля версий - не получится... размер там или дата создания файла - не показатель
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
07.11.2014, 13:02  [ТС]
Цитата Сообщение от krv Посмотреть сообщение
Project->Option->Version Info
галочка "Include version information in project"
И процедура вытаскивания версии
Это для определения версии исполняемого файла. А я говорю о файле базы данных *.mdb. Этот файл лежит отдельно и используется с разными программами. Осуществлять какую-то его привязку к *.exe файлу не хочется. Было бы неплохо выяснять по запросу актуальную версию этого *.mdb файла и при необходимости скачивать новую версию. Может быть можно как-то текущкю версию вшить в сам *.mdb файл?
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
07.11.2014, 13:04
Нитонисе,
Ну тут уж как хочется.. Попинать разработчика этой базы - пусть добавит таблицу с параметром "версия базы". примерно так.
1
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
07.11.2014, 13:09
Или, как вариант, держать номер текущей версии mdb-файла рядом с ним в текстовом [файле].
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
07.11.2014, 13:12  [ТС]
Цитата Сообщение от gunslinger Посмотреть сообщение
Или, как вариант, держать номер текущей версии mdb-файла рядом с ним в текстовом [файле].
Ну я выше о недостатках этого метода говорил. Если вдруг этот текстовик потеряется, то программа будет скачивать актуальную версию, так как просто не будет знать, что текущая версия и есть актуальная.

Вариант с добавлением таблицы с данными о версии базы в принципе можно реализовать, но как-то выглядит немного коряво.
0
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
07.11.2014, 13:25
Про это я прочитал, но вариант с текстом выглядит "привлекательней". Допустим, сделать "текстовик" скрытым для обычного пользователя (дополнительная "защита").
А "вдруг" можно и mdb потерять. Вопрос в другом. Как ты будешь из mdb номер версии получать. По крайней мере процедура окажется вряд ли легче, чем в случае текстового файла.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
07.11.2014, 15:41  [ТС]
gunslinger, попробовал по вашему способу скачивать файл (только не из потока), получается вот такое сообщение: "HTTP/1.1 302 Found." О чем эта ошибка?

Добавлено через 1 минуту
Цитата Сообщение от gunslinger Посмотреть сообщение
Вопрос в другом. Как ты будешь из mdb номер версии получать.
Ну это достаточно просто - выполню запрос к таблице, где хранится номер текущей версии.

Добавлено через 7 минут
Цитата Сообщение от Нитонисе Посмотреть сообщение
gunslinger, попробовал по вашему способу скачивать файл (только не из потока), получается вот такое сообщение: "HTTP/1.1 302 Found." О чем эта ошибка?
С этим разобрался. Просто неверную ссылку дал на скачивание.

Добавлено через 2 часа 6 минут
Подскажите еще как распаковать программно zip-архив, если я скачиваю обновление именно архивом?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.11.2014, 15:47
Цитата Сообщение от gunslinger Посмотреть сообщение
При желании можно и прогресс скачивания "прикрутить".
Именно так как ты привел прогресс, нельзя, ибо не синхронизированно (если в потоке)
1
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
07.11.2014, 16:15
Благодарю за замечание, полностью согласен. Код был написан до того, как я появился на этом форуме, и подсказку
C++
1
2
3
4
5
6
7
8
9
10
11
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(&UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall ThreadHTTP::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
осознал относительно недавно, раньше сильно на данном моменте внимание не заострял (работает вроде как, и ладно, но время исправляться когда-нибудь наступает [или наступит], по крайней мере при решение каких-то новых задач).
Старые "проекты" практически не поддерживаю, поэтому в примере код не исправлял.
Подчеркну дополнительно, что его (код для скачивания, из 8-го поста) желательно использовать лишь как "набросок".

Пусть ТС просмотрит литературу по синхронизации "данных из потока", дабы не наступать на чужие грабли.

Добавлено через 10 минут
Поправка: не "код для скачивания", а "код для прогресса скачивания".
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
11.11.2014, 15:27  [ТС]
Подскажите, как сделать такую штуку. Программа скачивает обновление, запускает программу Updater.exe (которая должна будет заменить исполняемый файл программы и запустить обновленную версию), закрывается, после чего Updater.exe делает свою работу. Проблема в том, что Updater.exe не должна сразу же пытаться заменить исполняемый файл основной программы, а подождать, пока он не закроется. Мне кажется инициировать запуск Updater.exe В обработчике OnClose основной программы не очень правильно.
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
11.11.2014, 15:42
есть еще сторонний компонент TMS WebUpdate
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
11.11.2014, 15:43
Я реализовал через Мьютекс.
Основная программа создает мьютекс, а апдейтер ждет пока он не освободится по зарытию.
Но это тоже не совсем верно. Ибо после освобождения мьютекса (выполнения FormDestroy главной формы окна) проходит еще какое то время, при котором мьютекс уже свободен, а ОС не освободила исполняемый файл основной программы.

Правильнее всего - отслеживать наличие основной программы в списке процессов ОС
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2014, 15:43
Помогаю со студенческими работами здесь

Как реализовать вывод обновлений на сайте?
Здравствуйте. Кто знает, обьясните пожалуйста хотя бы в самых общих чертах как сделать страницу с информацией о послених обновлениях на...

Программно выставить "Проверять наличие обновлений сохраненных страниц" в настройках IE
В настройках IE поставил в пункте "Проверять наличие обновлений сохраненных страниц" на "при каждом посещении страницы" ...

Как реализовать задержку выполнения определённой части программы без полной задержки всей программы?
Ниже представлен упрощённый код игры, в которой герой управляется ПКМ и подбирает предметы ЛКМ, которые перемещаются в инвентарь....

Организация обновлений программы
Не знаю в какую точно ветку писать этот вопрос. Пишу программу на Delphi (БД MS SQL), на ней уже начали работать пользователи. Теперь...

Проверка обновлений программы
Добрый день уважаемые форумчани. Учусь в колледже и только изучаю Delphi. Занялся своим маленьким проектом для которого будут выходить...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru