Форум » [x]Harbour » Как сделать обновление программы из инета ? » Ответить

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

Andrey: Всем привет. Нужно делать обновление программы из инета. Чтоб пользователь нажал кнопочку "Обновить программу" и она обновилась. Куда файлы обновления выкладывать ? Завести сайт и т.д ? Поделитесь опытом, как сделать.

Ответов - 46, стр: 1 2 3 All

PSP: Andrey пишет: Завести сайт и т.д ? Сайт не нужен. Нужен статический адрес в инете, за которым будет стоять сервер. На сервере запущена прога, которая слушает какой-то порт. Если на этот порт приходит запрос из вне, прога, после определенной процедуры аутентификации, должна либо разрешить соединение и выдать данные, либо отказать. Как-то так... :)

PSP: P.S. Можно попробовать сначала без статического адреса, с помощью сервиса dyndns.com, к примеру. Но возможны глюки. Статический все-таки лучше...

Andrey: PSP пишет: Нужен статический адрес в инете, за которым будет стоять сервер. Т.е. мне нужно будет держать свой сервер и иметь постоянный доступ в инет ?


PSP: Andrey пишет: Т.е. мне нужно будет держать свой сервер Ну да... и иметь постоянный доступ в инет ? Ну да... :) Можно, конечно, давать доступ по расписанию, но какой в этом смысл? :)

Andrey: Не хотелось бы иметь свой сервер. Лучше уж на странице сайта выложить и забыть. Только как скачать программно файл (обновления программы) со страницы сайта ?

fil: Через FTP

gfilatov2002: Andrey пишет: как скачать программно файл (обновления программы) со страницы сайта ? Вот пример процедуры обновления из исходников HMGS-IDE: ************************************************* PROCEDURE DownloadFromWWW( cURL, cLocalFileName ) ************************************************* LOCAL oCon, oUrl, i cLocalFileName := alltrim(cLocalFileName) nresp := isinternet() if nresp = .f. msgbox('Internet is not connected. Update is aborted') return endif oUrl := TURL():New( cUrl ) oCon := TipClientHttp():New( oUrl ) oCon:nConnTimeout := 20000 //MsgBox("Connecting with "+ oUrl:cServer) //msgbox('localfile= ' +clocalfilename) IF oCon:Open( cUrl ) //MsgBox("Connection established." +chr(10)+"Press OK to retrieve " + oUrl:cPath +oUrl:cFile) oCon:WriteAll(cLocalFileName) //MsgBox("Downloaded...") oCon:Close() FORM() ELSE MsgBox("Can't connect with "+ oUrl:cServer) IF oCon:SocketCon == NIL MsgBox("Connection not initiated") ELSEIF hb_InetErrorCode( oCon:SocketCon ) == 0 MsgBox("Server sayed: "+ oCon:cReply) ELSE MsgBox("Error in connection: " + hb_InetErrorDesc( oCon:SocketCon )) ENDIF ENDIF RETURN **************** PROCEDURE FORM() **************** DEFINE WINDOW Form_2 ; AT 0, 0 ; WIDTH 400 HEIGHT 215 ; TITLE "Extracting sources of HMGS_IDE to \Updates folder" ; NOMAXIMIZE NOSIZE ; FONT "Arial" SIZE 9; ON INIT UNZIPFILE() DEFINE PROGRESSBAR ProgressBar_1 ROW 60 COL 45 WIDTH 310 HEIGHT 30 RANGEMIN 0 RANGEMAX 10 VALUE 0 FORECOLOR {0,130,0} END PROGRESSBAR DEFINE LABEL Label_1 ROW 100 COL 25 WIDTH 350 HEIGHT 20 VALUE "" FONTNAME "Arial" FONTSIZE 10 TOOLTIP "" FONTBOLD .T. TRANSPARENT .T. CENTERALIGN .T. END LABEL ON KEY ESCAPE ACTION Form_2.Release END WINDOW CENTER WINDOW Form_2 ACTIVATE WINDOW Form_2 RETURN ********************* PROCEDURE UnzipFile() ********************* cCurDir := getstartupfolder() cArchive := cCurDir +"\ide.zip" //MSGBOX('CCURDIR= ' + CCURDIR) Form_2.ProgressBar_1.RangeMin := 1 Form_2.ProgressBar_1.RangeMax := Len( HB_GetFilesInZip(cArchive) ) - 1 RENAME ( cCurDir+'\IDE.EXE' ) TO ( cCurDir+'\IDEOLD.EXE' ) UNCOMPRESS cArchive ; EXTRACTPATH cCurDir + "\Updates" ; BLOCK {|cFile, nPos| ProgressUpdate( nPos, cFile, .T. ) } ; CREATEDIR COPY FILE ( cCurDir +'\UPDATES\BIN\IDE.EXE' ) TO ( cCurDir +'\IDENEW.EXE' ) EXECUTE FILE ( cCurDir +'\IDENEW.EXE' ) adata[ _DISABLEWARNINGS ] := '.T.' EXIT() RETURN ******************************************************* Function ProgressUpdate( nPos , cFile , lShowFileName ) ******************************************************* Default lShowFileName := .F. Form_2.ProgressBar_1.Value := nPos Form_2.Label_1.Value := cFileNoPath( cFile ) DO EVENTS if lShowFileName INKEY(.1) endif Return Nil ********************* Function IsInternet() ********************* LOCAL nEstado, cConexion := "" nEstado := InternetGetConnectedStateEx(0, @cConexion, 0, 0) Return (nEstado == 1) ******************************************************************************************* function InternetGetConnectedStateEx(lpdwFlags, lpszConnectionName, dwNameLen, dwReserved ) ******************************************************************************************* local uResult local hInstDLL := LoadLibrary("WININET.DLL") local nProcAddr := GetProcAddress(hInstDLL,"InternetGetConnectedStateEx") uResult := CallDLL(hInstDLL, nProcAddr,, 4, 4, lpdwFlags, 10, lpszConnectionName, 3, dwNameLen, 4, dwReserved ) FreeLibrary(hInstDLL) return uResult Надеюсь, что идея понятна...

Andrey: gfilatov2002 пишет: Вот пример процедуры обновления из исходников HMGS-IDE: Спасибо большое !

Andrey: Что-то с теорией не все понятно..... Допустим на странице сайта http://www.hmgextended.com/files/CONTRIB/ есть несколько обновлений: hmg-1.9-96-setup.zip hmg-1.9-95-setup.zip hmg-1.9-89-setup.zip Как на хХарборе или Харборе получить список обновлений и скачать последнее обновление ?

AlexMyr: Andrey пишет: Как на хХарборе или Харборе получить список обновлений и скачать последнее обновление ? Вот рабочий пример на харбор обновления баз для программы по законодательству, дополнительно использую wget (при обрыве есть докачка), может кому пригодится: nau.ini ------------------------------------------------- # кусок имени файла str_nau = nau9 # опция для wget докачка str_opt = -c # где расположен wget str_run = c:\sbin\wget\wget # откуда качать str_url = http://updates.nau.kiev.ua/ [FILES] # последний номер закач. обновления sud=1981 ukr=1770 # end of nau.ini Дальше сама ф-я FUNC main() LOCAL hIni := hb_IniRead( "nau.ini" ), ckey, asect, str_cmd, str_nau LOCAL arj_file, ifile, str1 := "" str_nau := hini["MAIN"]["str_nau"] str_cmd := hini["MAIN"]["str_run"] + " " + ; hini["MAIN"]["str_opt"] + " " + ; hini["MAIN"]["str_url"] + ; str_nau + "/" asect := hini["FILES"] for each ckey in asect:keys if ! hb_direxists("."+ckey) makedir(ckey) endif next for EACH ckey in asect:keys arj_file := 1 WHILE .T. nnFile := AllTrim( Str( Val(asect[ckey] ) + arj_file ) ) xFile := str_cmd + ckey + "/" + str_nau + SubStr( ckey, 1, 1 ) + nnfile + "." /* 1st step - try to get the arj*/ IF hb_processRun( xFile + "arj"+" -P ./"+cKey,,@str1 ) == 0 /* 2nd step - try to get the a01, a02, ...*/ ifile := 1 WHILE .T. IF hb_processRun( xFile + "a" + StrZero( ifile, 2 )+ " -P ./"+cKey ) == 0 ifile ++ ELSE aSect[ckey] := nnfile EXIT ENDIF ENDDO ELSE EXIT ENDIF ENDDO next hb_IniWrite( "nau.ini", hIni ) RETURN nil

Andrey: AlexMyr пишет: может кому пригодится: Конечно пригодиться. Спасибо большое. Не нашел функции в хХарборе hb_processRun ! Чем можно заменить ? Или перетащить из Харбора ?

AlexMyr: Andrey пишет: Чем можно заменить ? Я так думаю, что можно прикрутить __run, взял с misc.txt /* $DOC$ * $FUNCNAME$ * __RUN() * $CATEGORY$ * DOS * $ONELINER$ * Run an external program. * $SYNTAX$ * __RUN( <cCommand> )

Andrey: AlexMyr пишет: Я так думаю, что можно прикрутить __run Уж лучше тогда ShellExecute(GetDeskTopWindow(), 'open',cRunBatFile, "", "" , SW_SHOWNORMAL) !

Andrey: С технолигией скачки обновления программы разобрался. Спасибо всем БОЛЬШОЕ ! Теперь дальше вопрос: скачал я допустим MyUpdate-012.zip c инета, распаковал и заменил нужные мне файлы. А ехе-ник то мой в памяти, как мне его заменить НОВЫМ ? Т.е. запущена программа MyProga.EXE, мне нужно её завершить, скопировать из другой папки новую программу MyProga.EXE и запустить ее. Так можно сделать или нет ? Ручками то просто получается, а юзера то не разбираются в этом.

PSP: Пример: твоя MyProga.exe обнаруживает обновление. Информирует юзера, что нужно обновиться. Юзер соглашается. Прога завершается, а последняя выполненная строка - вызов MyProgaUpdate.exe (к примеру). Последняя копирует все, что нужно обновить, и завершается. А последняя строка в ней - вызов MyProga.exe

Andrey: PSP Спасибо. А как нибудь по хитрому нельзя, выгрузиться (завершить) работу и запусть временный бат-ник с копированием и запуском нового уже ехе-ника ?

Dima: Andrey По хитрому думаю можно включая перезагрузку компа и доработку проги в этом плане (не большую)

petr707: Вариант не временного, а постоянного батника- для однопользовательского режима ( когда не занят EXE-файл другими процессами) При обновлении - MyProga.exe создает новый EXE - NewMyProga.exe который переименуется внутри батника ---------------MyProga.cmd---------- if exist NewMyProga.exe goto 2 :1 MyProga.exe if not exist NewMyProga.exe goto 3 :2 ren NewMyProga.exe MyProga.exe goto 1 :3

PSP: Andrey пишет: выгрузиться (завершить) работу и запусть временный бат-ник с копированием и запуском нового уже ехе-ника ? Перед завершением MyProga.exe создает этот самый батник сама, запускает его. Батник все копирует, запускает MyProga.exe. Она уже при старте удаляет батник.

Andrey: Спасибо большое всем. Это явное решение. В принципе нормальное. А кто знает как другие программы делают эту операцию обновления ???



полная версия страницы