Live Update в X-стиле [RU].Ban0K! (www.int3.net) Хакер, номер #071, стр. 071-106-5 Листинг 1 <?php include "data.php"; // Проверяем клиента If($HTTP_SERVER_VARS["HTTP_USER_AGENT"] == "AutoUpdate browser") { // Получаем аргумент q $query = $HTTP_GET_VALS['q']; // Проверка запроса switch ($query) { case "GetVersion": . . . . . break; case "GetFileSize": . . . . . break; case "GetFile": . . . . . break; default: echo "ANY_ERROR"; } else echo "<script> document.location.href='/index.html'</script> "; ?> Листинг 2 function GetVersion(hSes:HInternet):integer; var // .... Buffer: array[1..1024] of Char; begin // Открываем соединение с запросом версии hUrl := InternetOpenUrlA(hSes,'http://localhost/?q=GetVersion',0,0,0,0); for i:=1 to 1024 do Buffer[i]:=Chr(0); // Скачиваем ответ Status := InternetReadFile(hUrl,@Buffer,SizeOf(Buffer),nr); // Возвращаем версию GetVersion:= StrToInt(Buffer); // Закрываем указатель InternetCloseHandle(hUrl); end; Листинг 3 function GetFile(hSes:HInternet;FileSize:integer;FileName:PChar):Bool; var // ... begin // Локализуем память Buffer:=AllocMem(FileSize); hUrl := InternetOpenUrlA(hSes,'http://localhost/?q=GetFile',0,0,0,0); Status := InternetReadFile(hUrl,Buffer,FileSize,nr); // Записываем на диск FileHandle:= FileCreate(FileName); FileWrite(FileHandle, Buffer^, FileSize); //Функция похожа на BlockWrite – буфер определенного размера пишется в файл FileClose(FileHandle); //Закрываем хендл InternetCloseHandle(hUrl); // Ok! GetFile:=True end; Листинг 4 function GetNowVersion():integer; var // ... begin for i:=1 to 1024 do Buffer[i]:=Chr(0); GetPrivateProfileString('Main','Version',0,@Buffer,1024,'update.ini'); GetNowVersion:=StrToInt(Buffer); end; function SetNowVersion(FileVersion:Integer):bool; begin SetNowVersion := WritePrivateProfileString('Main','Version',PChar(IntToStr(FileVersion)),'update.ini'); end; Листинг 5 procedure TUpForm.Button1Click(Sender: TObject); var // ... begin hSession := Connect; FileVersion := GetVersion(hSession); ver:=GetNowVersion; // Сравниваем версии if FileVersion> ver then begin i:=MessageBox(UpForm.WindowHandle,'На сайте доступно обновление модуля, начать закачку?','[A]pDate Client',1); if i=1 then begin // Освобождаем старую библиотеку FreeLibrary(Hn); FileSize := GetFileSize(hSession); Status := GetFile(hSession,FileSize,'plug.dll'); Hn:=LoadPlugin('plug.dll','PluginProc'); SetNowVersion(FileVersion); NowVersionLabel.Caption:=IntToStr(FileVersion); // Добавляем строку от новой библиотеки Memo1.Lines.Add(MainProc); // .. (Скачано) end; Disconnect(hSession); end; CD На CD лежит полный исходник проги, он готов к компиляции под Delphi. Также там есть скрипт, который ты должен положить либо на сайт, либо на локальный сервак. WWW Расширенный вариант статьи с более полным описанием WinInetApi можно найти на сайте www.iNT3.net. |