Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/45: Рейтинг темы: голосов - 45, средняя оценка - 4.91
CaHeK_Gop
5 / 5 / 2
Регистрация: 02.01.2011
Сообщений: 64
1

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

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

Привет всем.. Я хочю сделать сайт или что-то вроде этого, чтобы программа сама обновления скачивала и потом обновляла себя, а не скидывать программу другу каждый раз, когда я в нее добавлю что-то новенькое. Друг посто сможет зайти в настройки программы и там обновить ее. Это как-то возможно вообще? О_о
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2011, 23:32
Ответы с готовыми решениями:

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

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

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

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

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

26
LK
Заблокирован
20.02.2011, 00:18 2
Обновление программы через Интернет

Программа (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
1067 / 782 / 100
Регистрация: 01.02.2011
Сообщений: 1,795
Записей в блоге: 1
20.02.2011, 09:57 3
Лучший ответ Сообщение было отмечено как решение

Решение

На сайт заливаешь файл 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
LK
Заблокирован
20.02.2011, 10:49 4
1. Затем когда нужно проверить обновления, скачиваешь этот Update.inf с сайта.
2. С помощью TMemIniFile считываешь значение параметра Update Version и сверяешь с текущей. Если Update Version больше, чем текущий, то отображаешь диалог: "Обновить программу? Изменения в текущей версии:... Да\Нет". Если нажимают "Да", то
3. прога скачивает файл по ссылке, указанной в параметре Update File.
- неплохо бы это расписать поподробнее - с примером кода .
0
20.02.2011, 10:49
CaHeK_Gop
5 / 5 / 2
Регистрация: 02.01.2011
Сообщений: 64
20.02.2011, 13:45  [ТС] 5
Буду пробовать =)

Добавлено через 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
LK
Заблокирован
20.02.2011, 13:51 6
версия Билдера какая ?
0
CaHeK_Gop
5 / 5 / 2
Регистрация: 02.01.2011
Сообщений: 64
20.02.2011, 13:52  [ТС] 7
Embarcadero RAD Studio XE
0
LK
Заблокирован
20.02.2011, 14:19 8
A если поставить CppWebBrowser или просто WebBrowser ?
0
CaHeK_Gop
5 / 5 / 2
Регистрация: 02.01.2011
Сообщений: 64
20.02.2011, 14:26  [ТС] 9
LK, какая у Вас версия билдера? Давайте я ее установлю и попробую там скомпилировать
P.S. проблем то меньше будет
0
LK
Заблокирован
20.02.2011, 14:43 10
1. Rad XE
2. Я привел пример кода, а не свой код.

Добавлено через 2 минуты
Все упирается в скачивание файла, я так понял, как єто сделать по другому , можно посмотреть здесь : Получение форматированной HTML-страницы
1
kzru_hunter
1067 / 782 / 100
Регистрация: 01.02.2011
Сообщений: 1,795
Записей в блоге: 1
25.02.2011, 09:32 11
Цитата Сообщение от 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
по окончанию загрузки обновления будет завершено выполнение текущей версии программы и запущена новая версия.
если название выполняемого файла на хостинге совпадает с тем, что в проекте, то текущая версия будет перезаписана новой версией.

Добавил пример проекта (во вложении).
2
Вложения
Тип файла: zip UpdateModule.zip (3.9 Кб, 167 просмотров)
Тип файла: rar Пример проекта.rar (20.6 Кб, 152 просмотров)
kzru_hunter
1067 / 782 / 100
Регистрация: 01.02.2011
Сообщений: 1,795
Записей в блоге: 1
25.02.2011, 10:34 12
чтобы работал в Rad Studio XE, нужно _TCHAR maps to установить в char
1
m9IsKo
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 10
05.11.2011, 20:49 13
Подскажите пожалуйста я всё делаю как надо а у меня возникает ошибки
Обновление программы

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

Решение

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

0
LK
Заблокирован
08.11.2011, 05:10 17
когда - в какой ситуации - возникает? к какой строке кода относится ?
2
m9IsKo
0 / 0 / 0
Регистрация: 05.11.2011
Сообщений: 10
08.11.2011, 07:31 18
Вот
Обновление программы



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

 Комментарий модератора 
Перемещено в новую тему: Ошибка при запуске программы - vcl60.bpl не был найден :
Правила
п.2.4. На каждый вопрос создавайте по одной теме - это помогает избежать путаницы в ответах и облегчает поиск.
m9IsKo, для вложений используйте встроенные возможности форума - кнопка "Расширенный режим-Управление вложениями" - внизу окна редактирования сообщения !
0
iiwanc
3 / 3 / 2
Регистрация: 04.03.2013
Сообщений: 174
11.07.2013, 20:37 19
Цитата Сообщение от kzru_hunter Посмотреть сообщение
Обновил архивы.
Для тех, у кого стоит Indy10 придется заглянуть UpdateModule.cpp, там будет в самом верху кое-что написано, иначе будут ошибки при компиляции. К сожалению, не знаю как сделать так, чтобы этого не приходилось делать.
у меня вопрос по вашему модулю, который оформил в Ошибка: Проверьте интернет-соединение
Если не сложно, помогите, пожалуйста
0
iiwanc
3 / 3 / 2
Регистрация: 04.03.2013
Сообщений: 174
13.07.2013, 12:04 20
появляется сообщение при работе модуля:
"Информация об обновлении на сервере - некорректна."
Что может быть не так?
0
13.07.2013, 12:04
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2013, 12:04

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

Обновление программы
Подскажите, как можно реализовать обновление программы через интернет или с диска?

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru