Все больше и больше программ поддерживают функции онлайн-обновления. В этой статье рассказывается, как получить информацию об обновлении с веб-сайта. Здесь я в основном использую информацию о версии, чтобы определить, нужно ли мне загружать обновленную версию.
Общий принцип заключается в следующем:
1. Разместите информационный текст на сайте.
2. Используйте TNMHTTP для получения текстового содержимого из текста информации веб-сайта.
3. Проанализируйте информацию, необходимую для разбора текста.
4. Сравните версии программы, чтобы получить информацию об обновлении.
Сначала мы размещаем информационный текст на нашем сайте. Этот текст имеет свой собственный формат файла. Я определил следующий формат:
[обновлять]
<ver>1.79.9.25</ver>
<url>http://delphibox.com/softm/3_update.zip</url>
<дата>25 сентября 2002 г.</date>
[/обновлять]
Мы можем сохранить его как файл update.txt и использовать идентификатор []<> для классификации информации, которая включает имя программы, версию, дату обновления и адрес загрузки. Здесь я полагаю, что загружу его на http://2ccc.com/update.txt.
Затем мы используем компонент TNMHTTP, чтобы получить содержимое этого файла с веб-сайта:
функция TForm1.GetUpdateText:String;
начинать
NMHTTP1.InputFileMode := ЛОЖЬ;
NMHTTP1.OutputFileMode := ЛОЖЬ;
NMHTTP1.ReportLevel := Status_Basic;
NMHTTP1.Get('http://2ccc.com/update.txt'); {Получить текст веб-сайта}
Результат:=NMHTTP1.Body;
конец;
После получения текста нам нужно разделить информацию. Я использовал следующую функцию:
функция TForm1.AnalyseUpdate(Body:String;var Update:TUpdate):Boolean;
вар
ТмпСтр, Вер: Строка;
функция CenterStr(Src:String;Before,After:String):String;
{ Эта функция используется для разделения строки посередине двух строк.
Например..('DelphiBox.com','Delphi','.com')=>'Box'. }
вар
Поз1, Поз2: Слово;
начинать
Pos1:=Pos(Before,Src)+Length(Before);
Pos2:=Pos(After,Src);
Результат:=Копировать(Src,Pos1,Pos2-Pos1);
конец;
начинать
TmpStr:=CenterStr(Body,'update'); {Получите информацию об обновлении между именами программ}
если TmpStr='' тогда
Результат:=False else {Невозможно найти информацию об обновлении этого файла}
начинать
Ver:=CenterStr(TmpStr,'<ver>','</ver>');
Update.Version:=SeparateVerStr(Ver); {версия анализа}
Update.Date:=StrToDate(CenterStr(TmpStr,'<date>','</date>')); { Дата анализа}
Update.URL:=CenterStr(TmpStr,'<url>','</url>'); {Определить адрес обновления}
Результат:=Истина;
конец;
конец;
Где TUpdate — формат записи информации, которую я определил:
TSimpleVersion=record{Упрощенная информация о версии}
dwPROductVersionMS: DWORD;{основная версия}
dwProductVersionLS: DWORD;{дополнительная версия}
конец;
TUpdate=record {информация об обновлении}
Имя:String[63];{имя программы}
Версия:TSimpleVersion;{версия}
Дата:TDate;{дата}
URL:ShortString;{Адрес загрузки}
конец;
Функция SeparateVerStr() преобразует информацию об обновленной версии в строковой форме в упрощенный формат информации о версии:
функция SeparateVerStr(s:String):TSimpleVersion;
константа
Разделитель ='.'; {подумайте '.' разделитель}
вар
р,v1,v2,v3,v4:СЛОВО;
начинать
если Длина(и)=0, то Выход;
p:=pos(Разделитель, с);
v1:=StrToInt(copy(s,1,p-1));
Удалить(s,1,p);
p:=Pos(Разделитель,с);
v2:=StrToInt(copy(s,1,p-1));
Удалить(s,1,p);
p:=Pos(Разделитель,с);
v3:=StrToInt(copy(s,1,p-1));
Удалить(s,1,p);
v4:=StrToInt(s);
Result.dwProductVersionMS:=v1*$10000+v2;
Result.dwProductVersionLS:=v3*$10000+v4;
конец;
Последнее, что вам нужно сделать, это сравнить информацию о версии файлов и сначала получить свою собственную версию. Я использую следующую функцию:
function GetBuildInfo(FName:string):TSimpleVersion {получить информацию о собственной версии};
вар
ВерИнфоСизе: DWORD;
ВерИнфо: Указатель;
Вервалуесизе: DWORD;
VerValue: PVSFixedFileInfo;
Пустышка: DWORD;
начинать
VerInfoSize: = GetFileVersionInfoSize(PChar(FName), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '/', Указатель(VerValue), VerValueSize);
с VerValue^ сделайте
начинать
Result.dwProductVersionMS := dwFileVersionMS {основная версия};
Result.dwProductVersionLS := dwFileVersionLS {дополнительная версия};
конец;
FreeMem(VerInfo, VerInfoSize);
конец;
Затем используйте следующую функцию, чтобы сравнить обновленную версию веб-сайта с текущей версией. Если возвращается TRUE, это означает, что существует новая версия файла:
функция VersionCheck(OriVer,NewVer:TSimpleVersion):Boolean;
начинать
если (OriVer.dwProductVersionMS=NewVer.dwProductVersionMS), то
начинать
Результат: = OriVer.dwProductVersionLS<NewVer.dwProductVersionLS;
закончить еще
начинать
Результат:=OriVer.dwProductVersionMS<NewVer.dwProductVersionMS
конец;
конец;