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

Live Update в X-стиле

[RU].Ban0K! (www.int3.net)

Хакер, номер #071, стр. 071-106-4


Стоит заметить, что файл update.ini должен находиться в видимом для системы месте (я положил его в папку винды). Если нет такой возможности, путь к файлу просто надо будет указать явным образом.

Следующим этапом нашего большого пути будет подгрузка обновления (в нашем случае это плагин). Для этого мы организуем вот такую функцию:

function LoadPlugin(Plug:PChar;Proc:PChar):dword;

var

//...

begin

//Загрузка dll

H:=LoadLibrary(Plug);

//Получение адреса процедуры

@MainProc:= GetProcAddress(H, Proc);

LoadPlugin:= H;

end;

Вкратце опишу, что и зачем тут нужно. В предъявленном твоему взыскательному глазу листинге происходит динамическое проецирование указанной библиотеки на контекст программы, проще - ее подгрузка. Далее находится адрес нужной нам экспортируемой функции. Для этого, разумеется, используются API-функции LoadLibrary и GetProcAddress.

Наш пример

Теперь, после рассмотрения всех функций, перейдем непосредственно к примеру. Он будет представлять собой некую программу, ядро которой постоянно обновляется и построено в виде DLL. Запускаемая часть же только подгружает эту библиотеку и по желанию пользователя обновляет. Для простоты библиотека будет просто возвращать строку с собственной версией.

Для начала нужно подгрузить имеющуюся библиотеку (см. исходник, процедура FormCreate). Для создания процедуры обновления нужно просто собрать в кучу все, что было описано ранее. Если нет желания осознавать все сказанное, просто посмотри на листинг 5 либо всунь диск и открой исходник. Кстати, последнее очень рекомендую сделать в любом случае, потому что он намного полнее описанного в статье.

В заключение стоит сказать несколько слов про функцию FreeLibrary: она удалит из памяти библиотку, для того чтобы система разрешила ее переписать. По неизвестной причине в отладочном режиме (из-под Delphi) библиотека все равно не освобождается. При запуске исполняемого файла все работает отменно. Пример полностью отлажен и работоспособен. Скрипты устанавливаются для проверки работы на локальный хост, я использовал сервер Omni HTTPd PRO v2.08, но подойдет любой содержащий компилятор PHP. Никаких особых настроек не требуется, только не забудь исправить функцию Connect для тестирования в оффлайне.

Что следует доработать

Приведенный в статье пример служит только для... примера :), и в нем желательно еще многое доработать. Нужно переделать сам процесс закачки файла: его нужно сделать по частям, при этом программа не будет зависать и можно будет поставить индикатор процесса закачки. Желательно не выдавать файл прямо в запрос, а сначала послать ссылку на файл - так можно будет разобраться с версиями программы. Вот, собственно, и все. Бери исходник, изучай, компилируй, наслаждайся и пиши свое – больше и лучше :).

Назад на стр. 071-106-3  Содержание  Вперед на стр. 071-106-5