Delphi.int.ru — Портал программистов

Вход Регистрация | Забыли пароль?

События

Сегодня:
Вопросы0    Ответы0    Мини-форумы0


Последние:
Вопрос26.08, 21:10 / #6673
Ответ02.08, 00:42 / #6619
Новости30 апреля 2012


Сейчас онлайн:
На сайте — 10
На IRC-канале — 3

Ссылки

Synapse

Автор: Вадим К

Содержание

Вступление

Часто, чтобы раскритиковать программистов на Delphi, используют простой и дешёвый трюк. Мол, мы, истинные программисты пишем весь код ручками, а вы, делфисты, набросали компонентов и всё.

На самом деле весь код ручками пишут только фанатики и те, кому нечего делать. А нормальные программисты используют готовые библиотеки. Компоненты Delphi на самом деле тоже являются самыми настоящими библиотеками, просто написаны с учётом некоторых особенностей Delphi.

Но доказывать это им бессмысленно – всё равно будут сопротивляться (чтобы они согласились?). Мы пойдём другим путём – будем использовать самую что не наесть библиотеку - и пусть медитируют себе.

В качестве примера я представляю библиотеку Synapse (http://synapse.ararat.cz/doku.php). По возможностям эта библиотека соответствует популярным Indy, только стабильность у неё получше. К примеру, почту с вложениями отправлять/принимать или файлы по https качать на ней проще простого. А вот с Indy нужно хорошо помучаться.

И главный плюс этой библиотеки – полностью бесплатна с удобной BSD лицензией - можно использовать в своих приложениях - как бесплатных, так и в коммерческих, без каких-то отчислений. Но автор абсолютно не против, если вы подкинете ему пару копеек.

Установка библиотеки

Для начала нужно скачать библиотеку с сайта. Или просто взять в прилагаемом к статье архиве. Теперь распакуем куда-нибудь во временный каталог. Создадим папку, где будет располагаться сама библиотека – у меня это обычно каталог C:\Program Files\CodeGear\Components\Synapse. То есть, я, не стесняясь, создаю каталог в каталоге Delphi, и ставлю туда свои библиотеки/компоненты. Хотя некоторые сочтут это идеологически неверным – можно создать каталог для библиотек и в любом другом месте, главное, чтобы его потом не удалили. Второе условие – чтобы путь содержал только латинские символы. Иначе бывают проблемы с некоторыми компонентами. Один из посетителей сайта www.delphi.int.ru делает оригинально - он хранит всё это прямо на рабочем столе. А потом ругается, мол, ничего не работает.

Скопируем в новосозданную папку содержимое папки source\lib из распакованного архива.

Остался последний шаг – объяснить Delphi, что у нас есть новая библиотека. Для этого просто нужно прописать каталоги для поиска.

В случае с Delphi 2006-2007 это делается так:

  • File -> Close All. При надобности сохраните текущий проект (это страховочное действие, не помешает).
  • Tools -> Options. В появившемся диалоге в дереве слева находим Environment options -> Delphi Options -> Library – Win32.
  • Ищем поле Browsing path. Жмём кнопку […] справа от него.
  • В появившемся окне ищем снова кнопку […] и, нажав её, выбираем каталог, куда сохранили содержимое библиотеки и жмём ОК.
  • Теперь Add и ОК для закрытия окна.
  • Повторяем предыдущие три действия, только для поля Library Path.

Если же у вас Delphi 7 или младше, то нужно в меню Tools найти пункт Environment Options, а потом вкладку Library. Всё остальное - очень похоже.

Сделай это по-простому

Так, библиотека установлена, пора написать что-то простенькое. Например, научимся скачивать страничку из интернета и отображать в Memo. Создаём новый проект, Ставим на форму Memo, растянем нормально и включим полосы прокрутки установкой свойства ScrollBars = ssBoth. Ставим на форму кнопку, кликая дважды по ней, создаём обработчик. Но перед написанием обработчика, надо добавить один юнит в список uses, а именно – httpsend.

А теперь сам обработчик. Приготовились увидеть сверхсложный код? Вот он – одна строчка:

HttpGetText('http://вашсайт.нет', Memo1.Lines);

Не правда ли просто? Но на самом деле, лучше написать немного сложнее:

if not HttpGetText('http://вашсайт.нет', Memo1.Lines) then
  ShowMessage('Не получилось скачать:('); 

Этот код нужен только для контроля ошибок, но это часто важно. Интересно, что если страничку не удастся скачать, то никаких ошибок не будет, просто функция возвратит false. Иногда очень удобно, особенно в потоках.

Замечателен и следующий факт. Так как библиотека является лёгкой обёрткой над обычными сокетами, то это сказывается на размере выполняемого файла. Этот же пример, переписанный с использованием Indy весит на 30% больше – а это весомый аргумент (если быть точнее, то в цифрах два исполнимых файла у меня весили 404 и 530 кбайт).

А посерьёзнее?

А теперь усложним задачку. Предположим, надо скачать файл/страницу с ресурса, использующего SSL. В случае с Indy это сделать очень сложно. Точнее, написать приложение-то просто, но вот чтобы оно работало... Оно или требует библиотеки OpenSSL, или говорит, что найденные библиотеки не подходят. Решается проблема скачиванием "правильных версий библиотек". Но даже имея их, всё равно проблемы. Если какое-то приложение использовало "неверные библиотеки", то до перезагрузки компьютера работать ничего не будет. Или то грузится, то нет. Почему так – предположения есть, но не хочется разбираться. Есть дела поважней.

Итак, что надо сделать для решения нашей "сложной" задачи? Первым долгом убедиться, что в системном каталоге есть файлы ssleay32.dll и libeay32.dll. (для тех, кто не нашёл, я в архиве приложил их). Рекомендуемая версия – не меньше 0.9.7. В архиве – 0.9.8.2. Если "загрязнять" системный каталог (C:\Windows\System32) не хотите, то можно просто рядом с приложением положить эти файлы.

А теперь осталось сделать в нашей миниатюрной программе одно изменение – добавить в список uses файл ssl_openssl. И всё. Теперь можно скачивать как с http, так и с https. Библиотека сама разберётся со всем!

Хочу пример сложнее!

В качестве рабочего приложения хочу представить маленькую программу для получения whois информации. Whois сервер – это сервер, который по ip или имени домена выдаёт некоторую информацию о его принадлежности. Например, владельца, город/страну, где расположен сервер. Но для "повышения секретности" мы будем использовать сайт https://www.nic.ru/whois/, который может предоставлять эту информацию по SSL.

Сам код смотрите в приложенном архиве.

В этот раз я даже не использовал потоки – я не хотел усложнять пример. В коде интересны два момента. Первое – это "очистка" полученного результата от ненужного текста и "русификация". То есть, вместо непонятных английских слов подставлены русские.

Второй момент – это выделение из содержимого скачанной странички нужной информации. В этот раз я обошёлся без регулярных выражений, хотя можно было и с ними.

В целом, в коде нет ничего сверхсложного, и я не считаю нужным объяснять его. Просто посмотрите и всё поймете.

Заключение

Помните, что когда решение задачи начинает слишком усложняться – значит вы выбрали неверный способ решения, не более. Один мой знакомый, пытаясь скачать страничку по https, и промучавшись несколько дней, на моё предложение использовать Synapse, сказал: "Нет, хватит с меня, ещё одно. Лучше я напишу на чистых сокетах. Надоели эти поделки. Моё будет работать". Кстати, пишет он уже несколько недель :-) и ругает кривой Windows, который ему постоянно мешает. Но мы-то знаем, где правда.

Файлы к статье »

Автор: Вадим К

Статья добавлена: 26 июня 2008

Следующая статья: Pascal и Delphi »

Рейтинг статьи: 4.80 Голосов: 5 Ваша оценка:

Зарегистрируйтесь/авторизируйтесь,
чтобы оценивать статьи.


Статьи, похожие по тематике

 

Для вставки ссылки на данную статью на другом сайте используйте следующий HTML-код:

Ссылка для форумов (BBCode):

Быстрая вставка ссылки на статью в сообщениях на сайте:
{{a:49}} (буква a — латинская) — только адрес статьи (URL);
{{статья:49}} — полноценная HTML-ссылка на статью (текст ссылки — название статьи).

Поделитесь ссылкой в социальных сетях:


Комментарии читателей к данной статье

bugmenot
Репутация: +24

bugmenot (11 октября 2011, 12:32):

Depebdency Walker тут нужен. А сборки могут быть любыми, Apache, например, выносят zlib отдельным модулем.
A-MaR
Репутация: нет

A-MaR (11 октября 2011, 09:08):

От сборки зависит только версия рантайма. Запускать пример с оригинальными длл-ками я пробовал, точно также не работало. А разгадка нашлась в виндовом журнале событий, для длл из примера запись выглядела так:

Тип события: Ошибка
Источник события: SideBySide
Описание:
Зависимая совокупность Microsoft.VC80.CRT не может быть найдена, последняя ошибка Указанная совокупность не установлена в системе.
bugmenot
Репутация: +24

bugmenot (11 октября 2011, 08:52):

Цитата:

Microsoft.VC90.CRT (это для ssleay32.dll и libeay32.dll версии 1.0.0d

Это всецело зависит от используемой сборки OpenSSL. Очевидно, что данная требует рантайма от Visual C++ потому, что собиралась в Visual Studio.
bugmenot
Репутация: +24

bugmenot (11 октября 2011, 08:52):

Цитата:

Microsoft.VC90.CRT (это для ssleay32.dll и libeay32.dll версии 1.0.0d

Это всецело зависит о используемой сборки OpenSSL.
A-MaR
Репутация: нет

A-MaR (11 октября 2011, 08:37):

глюкануло маленько на радостях с обрывком последнего предложения:-D
A-MaR
Репутация: нет

A-MaR (11 октября 2011, 08:35):

Как выяснилось, не хватало совокупности Microsoft.VC90.CRT (это для ssleay32.dll и libeay32.dll версии 1.0.0d, для длл версий 0.9.х из данного примера потребуется Microsoft.VC80.CRT, ее я качать уже не стал, но очевидно что ситуация аналогична). После ее установки все прекрасно заработало:). Это конкретно , для более ранних, возможно, нужна другая
Вадим К
Репутация: +359

Вадим К (10 октября 2011, 18:31):

Девственно чистые системы бывают разные. К примеру, может быть сайт имеет хитрый сертификат, который не проходит проверку. А корневые сертификаты в разных системах могут быть разные.
A-MaR
Репутация: нет

A-MaR (10 октября 2011, 18:23):

Длл-ки изначально лежали в папке приложения, хотя для чистоты эксперимента пробовал положить их в system32. Фаерволов и антивирусников нет, система, повторюсь, кристально чистая. Служба встроенного фаера отключена.
Что еще предпринималось: в тотал-коммандере есть утилита просмотра длл с выводом полного дерева зависимостей - она тоже показывает что все в порядке, отсутствующих библиотек нет. Сейчас копаюсь в исходниках Synapse, пока не очень результативно
Вадим К
Репутация: +359

Вадим К (10 октября 2011, 16:10):

А пробовали эти длл скопировать не в каталог винды (что очень плохо), а положить рядом с приложением?
К тому же, не нужно забывать о том, что есть разные фаерволы, которые иногда очень портят все. И даже если их выключить полностью, это ещё ничего не значит - они думаю, что пользователь глупый и лучше все таки его защищать.
A-MaR
Репутация: нет

A-MaR (10 октября 2011, 16:06):

Вадим К, а на только что установленной и девственно чистой системе пробовали? У меня проблемы именно на таких, там где работает, уже установлена туева хуча разного софта, и по-любому что-то из этого софта либо доставляет в систему еще какие-то длл-ки, либо пишет что-то в реестр, что и требуется для работы этого примера. Но что именно? Уже второй день бьюсь. Нашел и установил дистрибутив Win32OpenSSL - тоже не помогло.
Вадим К
Репутация: +359

Вадим К (10 октября 2011, 11:27):

На WinXP и 2000 взлетало с пол пинка. На Висте и Семерке не пробовал (когда писался черновик этой статьи, о них ещё и в майкрософте толком никто не знал:) )
С другой стороны, говорить программисту "не работает" - стыдно. Программист должен ковырять, искать, находить и рассказывать для других.
A-MaR
Репутация: нет

A-MaR (10 октября 2011, 11:12):

Сделал все четко по инструкции... На половине компов связь по SSL в этом примере работает, на половине нет. Закономерность установить так и не могу, кроме того что не взлетело ни на одном из компов с Windows XP, на висте в большинстве работает, но на одном компе тоже облом. Может все-таки кроме ssleay32.dll и libeay32.dll нужно еще что-то?
mirt.steelwater
Репутация: +2

mirt.steelwater (13 декабря 2010, 18:18):

подскажите, как с помощью этого synapse можно забрать и отправить почту на gmail - никак не могу найти такой рабочий пример. спасибо!
Учусь
Репутация: нет

Учусь (14 июня 2010, 01:18):

Фига...
Gooddy
Репутация: +21

Gooddy (28 мая 2009, 01:18):

Супер! Давно искал замену инди:)

Оставлять комментарии к статьям могут только зарегистрированные пользователи.