Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #71, НОЯБРЬ 2004 г.

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.

Назад на стр. 071-106-4  Содержание