Обмен сообщениями
Как уже упоминалось ранее, операционная система Windows® основана на сообщениях, возникающих в результате действий пользователя, аппаратуры компьютера или других программ. Поведение каждого окна полностью определяется тем, какие оно принимает сообщения и как их обрабатывает. В большинстве случаев, обработка сообщений в Delphi выполняется через события. Однако, бывают ситуации, когда может потребоваться послать и/или обработать сообщение самостоятельно. Существуют два типа сообщений, которые могут потребовать обработки в обход обычной системы сообщений Delphi: Сообщения Windows®, не обрабатываемые VCL Сообщения, определяемые пользователем
В принципе, сообщения делятся на две категории: Командные сообщения Уведомляющие сообщения
Командные сообщения используются как программистами, тек и Windows®. Они управляют элементам операционной системы и прикладным программам. Уведомляющие сообщения содержат информацию об изменении состояния окон Windows®, их отдельных элементов и устройств системы. Они посылаются только самой средой окон Windows®.
Каждое сообщение имеет два параметра: WPARAM и LPARAM. В 32-х битной среде оба эти параметра имеют размер 32 бита (longword). В 16-битной Windows WPARAM - это 16 битное число (word), а LPARAM - 32-битное (longint).
Для отправки сообщений API Windows® содержит две функции: function PostMessage( HWND hWnd, // handle of destination window UINT Msg, // message to post WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ):BOOLEAN; function SendMessage( HWND hWnd, // handle of destination window UINT Msg, // message to send WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ): LRESULT;
Первая из них отправляет сообщение в очередь сообщений Windows® и немедленно возвращает управление. PostMessage возвращает TRUE, если вызов функции прошел успешно и FALSE в противном случае.
Функция SendMessage отличается от PostMessage тем, что, послав сообщение, она не возвратит управление до тех пор, пока сообщение не будет доведено до получателя.
Обе функции имеют одинаковые параметры: HWND - дескриптор окна, которому предназначается сообщение, UINT - сообщение, которое должно быть послано, WPARAM и LPARAM - параметры сообщения.
В следующем примере главной форме проекта посылается сообщение о закрытии приложения: PostMessage(Handle,WM_QUIT,0,0);
В дополнение к функциям API Windows® VCL содержит метод Perform, который можно использовать для посылки сообщений любому окну VCL. function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
Perform обходит систему передачи сообщений Windows® и направляет сообщение непосредственно механизму обработки данного окна. С использованием предыдущий пример будет выглядеть следующим образом: Perform(WM_QUIT,0,0);
VCL имеет события примерно лишь для 20% наиболее часто используемых сообщений Windows®. У программиста может возникнуть необходимость обработать сообщения, для которых в VCL события не предусмотрены. Для обработки сообщений ОС, не имеющих соответствующих событий в Delphi есть ключевое слово message. С его помощью конкретный метод в коде программы может быть связан с любым сообщением Windows®. Когда окно приложения получает это сообщение вызывается соответствующий метод. Для реализации обработки сообщения на этом уровне необходимо:
1. Включить объявление метода для обработки сообщения в объявление класса, указав ключевое слово message и название сообщения, для обработки которого данный метод редназначен.
2. Включить определение метода в раздел implementation.
Приведем пример определения метода, обрабатывающего сообщение WM_ERASEBKGND: Procedure WmEraseBkgnd(var Msg:tWMEraseBkgnd); message WM_ERASEBKGND;
Ключевое слово message указывает на то, что данный метод используется для обработки сообщения ОС, имя которого указано после этого ключевого слова: WM_ERASEBKGND. Следует также отметить, что параметр метода является записью типа tWMEraseBkgnd. type TWMEraseBkgnd=record Msg:Cardinal; DC:HDC; Unused:Longint; Result:Longint; end;
В VCL имеются записи для большинства сообщений Windows® (они определены в модуле Messages.pas). Именем записи является имя сообщения с префиксом t и без подчеркивания. Сам метод можно назвать как угодно, но приведенная выше форма является общепринятой. В этом методе может возникнуть необходимость вызвать обработчик сообщения, установленный по умолчанию. Для этого необходимо вызвать виртуальный метод класса tObject DefaultHandler: procedure tObject.DefaultHandler(var Message); virtual;
Помимо нормальных сообщений Windows®, можно создать свое собственное сообщение. еализация и перехват определяемого пользователем сообщения идентичны обработке сообщений Windows®. Единственное отличие состоит в том, что это сообщение необходимо сначала определить: Const My_Message = WM_USER + 1;
Эта строка объявляет пользовательское сообщение с именем My_Message.
Для обработки сообщений, определенных пользователем в качестве типа параметра обработчика сообщения следует использовать запись общего вида tMessage: type tMessage = record Msg:Cardinal; WParam:Longint; LParam:Longint; Result:Longint; end;
Здесь, как и во всех других определенных в VCL для сообщений записях, поле Msg определяет передаваемое сообщение, поле Result - результат действия обработчика. Уникальные для данной записи поля WParam и LParam содержат соответствующие параметры сообщения.
Для посылки определяемых пользователем сообщений можно использовать функции SendMessage, PostMessage, однако, предпочтительнее в данном случае использовать Perform.
Сокеты
Наиболее современным и даже "модным" является общение процессов на уровне сокетов. Популярность их обусловлена взрывным ростом интереса как пользователей, так и специалистов к Internet и всему, что связано с этой сетью.
Общепринятой и стандартизованной на международном уровне является семиуровневая модель структуры протоколов связи под названием интерфейс открытых систем (Open Systems Interface, OSI). На каждом из уровней — от первого, физического, до высших уровней представления и приложений — решается свой объем задач и используется свой инструментарий.
Сокеты находятся как раз на промежуточном, так называемом транспортном уровне семиуровневой структуры. "Под ним", на сетевом уровне, находится протокол IP (основа TCP/IP — Transmission Control Protocol/Internet Protocol). Над ним находятся протоколы сеансового уровня (сервисы), ориентированные на конкретные задачи — например, FTP (для передачи файлов), SMTP (почтовый), всем известный гипертекстовый протокол HTTP и другие. Использование сокетов, с одной стороны, позволяет абстрагироваться от частностей работы на нижних уровнях, с другой — решать широкий круг задач, недоступный специализированным протоколам.
С точки зрения своей сущности сокет — это модель одного конца сетевого соединения, со своими свойствами и возможностью читать и записывать данные. С точки зрения содержания — это прикладной программный интерфейс, входящий в состав разных операционных систем, в том числе Windows — начиная с версии 3.11. Последняя его реализация носит название WinSock 2.0. Прототипы функций содержатся в файле WINSOCK.PAS, поставляемом с Delphi.
API сокетов впервые появился в среде Unix и стал популярен вместе с (и благодаря) протоколом TCP/IP. Именно они являются строительным материалом, из которого построена сеть Internet. Но сокеты не обязательно базируются на TCP/IP, они могут базироваться на IPX/SPX и других протоколах.
Механизм соединения при помощи сокетов таков. На одной стороне создается клиентский сокет. Для инициализации связи ему нужно задать путь к серверному сокету, с которым предстоит установить соединение.
Путь в сети задается двумя параметрами: адресом или равноценным ему именем хоста, или просто хостом и номером порта. Хост — это система, в которой запущено приложение, содержащее сокет. Неверно приравнивать понятие "хост" или "адрес" к понятию "компьютер" — у компьютера может быть несколько сетевых устройств и несколько адресов. Адрес в сетях TCP/IP задается четверкой чисел в диапазоне 0..255, например, так: 192.168.99.1. Естественно, каждый адрес даже в рамках Internet уникален — за этим следит специальная организация. Имя хоста, как правило, — символьная строка, поставленная в соответствие адресу и записанная по правилам UNC, например #"#">> раздел hardware
Обзоры программ: > раздел software
Программирование: > раздел programming
Операционные системы: > раздел ОС
Графика и дизайн: > раздел graphics
Сетевые технологии: > раздел network
Страницы: 1, 2, 3, 4, 5, 6, 7, 8