Сегодня я хочу научить тебя, как можно расширять возможности Delphi. Те компоненты, которые доступны на палитре – это только основа. Ты можешь расширять их количество и качество по своему усмотрению. Для этого в инете полно библиотек компонентов, написанных нашими братьями по хаку, которые ты можешь подключать к Delphi. Среди них есть платные, а есть и бесплатные, которые по качеству не отличаются даже от родных.
В этой статье я покажу, как подключить к Delphi библиотеку компонентов и мы напишем пример её использования. Я долго думал, какую библиотеку подключить, и какой пример написать. Скоро новый год и хотелось сделать тебе подарок. Но после выхода октябрьского номера Х я понял, что это обязательно должно быть связано с сетью. Сканер портов и сниффер были встречены тобой так горячо, что я просто обязан написать что-то подобное к новому году. Решение было одно – показать тебе, как написать собственную утилиту Ping.
РАСШИРЯЕМ ВОЗМОЖНОСТИ DELPHI :
Для сегодняшнего примера нам понадобится убойная и бесплатная библиотека Internet Component Suite (ICS). Её ты можешь скачать по адресу http://www.rtfm.be/fpiette/indexuk.htm. Когда скачаешь, разархивируй ics.zip в отдельную директорию, например C:\components.
Теперь запусти Delphi. Как всегда, при запуске он создаст новый проект. Он нам пока не нужен, поэтому закрой его (File->Close All). Теперь нужно открыть с помощью Delphi библиотеку, которую ты скачал. Она находится в дире, куда ты разархивировал ICS (у меня это C:\components\ Delphi\Vc32). Файл, который надо открыть называется IcsdelХХ.dpk, где ХХ – номер версии установленной у тебя Delphi. Если у тебя стоит Delphi6, то можно открыть и Icsdel50.dpk, он установится без проблем.
Рисунок 2. Библиотека компонентов
Когда ты откроешь библиотеку, перед тобой появится окно, как на рисунке 2. В этом окне нажми кнопку Install, чтобы Delphi откомпилировал пакет и проинсталил его в систему. Если ты всё сделал правильно, то должно появится окно, с перечислением новых установленных компонентов (рисунок 3).
Рисунок 3. Установка завершена
Теперь нужно указать Delphi, где находятся файлы пакета. Для этого выбери Tools пункт Environment Options. Перед тобой появится окно настроек Delphi. Перейди на закладку “Library” (смотри рисунок 4).
Рисунок 4. Настройки Delphi
Щёлкни на кнопке напротив строки «Library path» и ты увидишь окно, как на рисунке 5. Внизу окна есть строка ввода. Введи туда путь к директории, куда ты разархивировал пакет (у меня это C:\components\ Delphi\Vc32). Нажми пимпу «Add». Теперь можно закрывать все окна. Смело дави «ОК».
Рисунок 5. Добавление директории пакетов
Теперь у тебя на палитре компонентов появилась новая закладка FPiette. Все компоненты этой библиотеки очень быстрые и достаточно хорошие. Единственный недостаток - глючит компонент FTPClient. Я отправлял письмо разработчику с описанием ошибки и как её исправить ещё год назад, но она до сих пор не исправлена. А в остальном всё просто супер.
Рисунок 6. Закладка FPiette
ДИЗАЙНИМ ФОРМУ :
Теперь переходим к шкодингу. Создай новый проект. Теперь брось на форму два компонента TLabel и два TEdit. Поставь их так, как показано на рисунке 7.
Рисунок 7. Форма будущей проги
У Label1 измени свойство Caption на ‘Имя компьютера’, а у Label2 измени на ‘Размер пакета’. Напротив Label1 должен стоять Edit1. Сюда ты будешь вводить IP адрес или имя компа, который надо пропинговать. В Edit2 будем вводить размер пакета.
Ещё не помешает поставить на форму компонент RichEdit с закладки Win32. В него мы будем записывать результат пинга. И, наконец, компонент Ping с закладки FPiette, который и будет производить пинг.
Всё!!! Форма готова. Осталось только написать код, которого не так уж и много.
ШКОДИНГ :
Создай обработчик события OnClick для кнопки. Там нужно написать содержимое листинга 1. Здесь первой строкой я вывожу в компонент RichEdit сообщение о начале пинга. Вторая строка устанавливает размер пакета пинга (Ping1.Size) в то, которое указано в Edit2. Последняя строка запускает поиск компьютера через DNS (Ping1.DnsLookup). Даже если ты введёшь IP адрес, поиск в базе DNS ничего плохого не сделает.
Теперь выдели компонент Ping1 и создай для него обработчик события OnDnsLookupDone (когда закончен поиск в базе DNS). Здесь напиши содержимое листинга 2. Чтобы легче было разобраться с его содержимым, я снабдил листинг комментариями.
Едем дальше. Нам ещё нужно выловить результат пинга. Для этого создай обработчик события OnEchoReply для компонента Ping1. Здесь я вывожу результат пинга. Если Error равно 0, то показываю сообщение об ошибке. Если нет, то показываю время, за которое прошёл пинг.
И на последок сделаем ещё косметическую вещь. Создай обработчик события OnEchoRequest для компонента Ping1. В нём напиши содержимое листинга 4. Это чисто косметическая поправка, которая вводит состояние пинга.
Рисунок 8. Результат работы пингера
ИТОГО :
Теперь в твоём арсенале появилась ещё одна утила собственного изготовления, которая обязательно должна присутствовать у любого хакера или админа. Ты можешь модернизировать пример так, как тебе вздумается. Для чего хакеру нужен пинг? Мне часто приходит в Hack-FAQ вопрос: «Как узнать IP адрес сервера?». Самый простой способ сделать это - Ping. Просто пингуешь символьное имя сервера, а твоя утила сразу показывает тебе IP адрес сервера.
Как всегда, исходники примера можно найти на моём сайте http://www.cydsoft.com/vr-online/. У меня на странице лежит немного улучшенный пример. Просто моя рубрика не резиновая и я не в состоянии описать всё. Я могу только толкнуть тебя в нужную сторону, а остальное пора уже додумывать самому. Там же есть ссылки на лучшие библиотеки компонентов нашей бескрайнёй сети.
procedure TPingForm.Ping1DnsLookupDone(Sender: TObject; Error: Word);
begin
//Если произошла ошибка то …
if Error <> 0 then
begin
//Вывести сообщение об ошибки.
RichEdit1.Lines.Add('Хост не найден ''' + Edit1.Text + '''');
//Выход.
Exit;
end;
//Если ошибок небыло, то выводим в RichEdit1 результат поиска.
RichEdit1.Lines.Add('Хост ''' + Edit1.Text + ''' - ' + Ping1.DnsResult);
//Устанавливаем свойство Address компонента Ping в
//адрес найденный в базе DNS
Ping1.Address := Ping1.DnsResult;
//Запускаем Ping
Ping1.Ping;
end;
ЛИСТИНГ 3 :
procedure TPingForm.Ping1EchoReply(Sender, Icmp: TObject; Error: Integer);
begin
if Error = 0 then
RichEdit1.Lines.Add('Немогу выполнить операцию ping: '+Ping1.ErrorString)
else
RichEdit1.Lines.Add('Получено ' + IntToStr(Ping1.Reply.DataSize)+
' байт от '+Ping1.HostIP+' за ' + IntToStr(Ping1.Reply.RTT)+
' милисекунд');
end;
ЛИСТИНГ 4 :
procedure TPingForm.Ping1EchoRequest(Sender, Icmp: TObject);
begin
RichEdit1.Lines.Add('Посылка ' + IntToStr(Ping1.Size) +
' байтов на ' + Ping1.HostName);
end;