Виды и средства взаимодействия ; Каналы связи ; Сигналы и прерывания. Лекция 6. Взаимодействующие процессы 1 07.11.2012 8:22:25.

Презентация:



Advertisements
Похожие презентации
Кооперация процессов Процессы Бленда Николай Андреевич 2009.
Advertisements

Реализация взаимодействия процессов. Взаимодействие процессов взаимодействие в рамках локальной ЭВМ (одной ОС) взаимодействие в рамках сети родственные.
Реализация взаимодействия процессов. Взаимодействие процессов взаимодействие в рамках локальной ЭВМ (одной ОС) взаимодействие в рамках сети родственные.
Реализация взаимодействия процессов. Взаимодействие процессов взаимодействие в рамках локальной ЭВМ (одной ОС) взаимодействие в рамках сети родственные.
Основы операционных систем. Тема 4. Кооперация процессов и основные аспекты ее логической организации.
Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. В языке Паскаль файл представляет собой последовательность.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
Учитель информатики Трашков О.Л.. Для оперативного обмена информацией и совместного использования общих ресурсов компьютеры объединяют в сеть. Ресурсами.
Файловая переменная. Файл – совокупность данных, записанная во внешней памяти под определенным именем. Любой файл имеет три характерные особенности: уникальное.
Сетевые службы Для конечного пользователя сеть это не компьютеры, кабели и концентраторы и даже не информационные потоки, для него сеть это, прежде всего,
Введение в параллельные вычисления. Технология программирования MPI (день второй) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Лекция 6 Множественное распараллеливание на Linux кластере с помощью библиотеки MPI 1. Компиляция и запуск программы на кластере. 2. SIMD модель параллельного.
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
Лекция 3. Исключения и прерывания в встроенных системах.
Лекция 11 Файлы. Точного определения файла не существует. Файлом может быть: Объект файловой системы (файлы, папки и т.д.) Устройство ввода/вывода (клавиатура,
Системное программное обеспечение Лекция 4 Кооперация процессов.
Текстовые файлы Вербицкая Ольга Владимировна, Заозерная школа 16.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 4 Работа с бинарными файлами (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков.
Файл это поименованная область диска. Чтобы записать информацию в файл надо проделать следующие операции 1.Открыть файл 2.Вывести данные в файл 3.Закрыть.
Транксрипт:

Виды и средства взаимодействия ; Каналы связи ; Сигналы и прерывания. Лекция 6. Взаимодействующие процессы :22:25

Причины взаимодействия. Средства взаимодействия 2 Для нормального функционирования процессов операционная система старается максимально обособить их друг от друга. Тем не менее, для решения некоторых задач процессы могут объединять свои усилия. Причины для взаимодействия: повышение скорости работы; совместное использование данных; модульная конструкция какой-либо системы; для удобства работы пользователя. Процессы, которые влияют на поведение друг друга путем обмена информацией, принято называть кооперативными или взаимодействующими процессами Средства обмена информацией: канальные; сигнальные; разделяемая память :22:25

Логическая организация механизма передачи информации 3 АБ Способы адресации: Прямая симметричная А ? ? Прямая асимметричная Если и процесс, от которого данные исходят, и процесс, принимающий данные, оба указывают имена своих партнеров по взаимодействию, то такая схема адресации называется симметричной прямой адресацией. А ? ? Непрямая :22:25 Ни один другой процесс не может вмешаться в процедуру симметричного прямого общения двух процессов, перехватить посланные или подменить ожидаемые данные. Если только один из взаимодействующих процессов, например передающий, указывает имя своего партнера по кооперации, а второй процесс в качестве возможного партнера рассматривает любой процесс в системе, например, ожидает получения информации от произвольного источника, то такая схема адресации называется асимметричной прямой адресацией

Каналы связи 4 Информационная валентность: АБ Одновалентная А ? ? Многовалентная ? АБ Симплексный Классификация каналов связи: АБ Полудуплексный АБ А Б Небуферезированный А Б Буферезированный :22:25

Канальные средства взаимодействия 5 Потоки ввода/вывода: Способ коммуникации процессов через файл имеет следующие недостатки: · ограничения по объему файла обмена; · ограничение прав доступа к файлу обмена; · возможность искажения или потери данных в файле независимо от процессов, которые используют его для обмена; · время существования файла обмена не зависит от времени жизни использующих его процессов, поэтому данные в файле продолжают сохраняться и тогда, когда их никто не использует. Программные каналы: Программный канал есть средство коммуникации процессов, которое можно рассматривать как программно реализованную линию связи для передачи данных между двумя или более процессами. Каналы реализованы в виде снабженных специальным механизмом управления буферов ввода-вывода, которые рассматриваются как псевдофайлы :22:25

6 Канальные средства взаимодействия Основной принцип работы канала состоит в буферизации вывода одного процесса и обеспечении возможности чтения содержимого программного канала другим процессом. При этом часто интерфейс программного канала совпадает с интерфейсом обычного файла и реализуется обычными файловыми операциями read и write. Механизм генерации канала предполагает получение процессом - создателем ( процессом - сервером ) двух описателей (handles) для пользования этим каналом. Один из описателей применяется для чтения из канала, другой - для записи в канал. Один из вариантов использования канала - это его использование процессом для взаимодействия с самим собой. Рассмотрим следующее изображение системы, состоящей из процесса и ядра, после создания канала Из этого рисунка легко увидеть, что даже если процесс посылает данные самому себе, они проходят через ядро. Следовательно, для организации таких каналов, а также их именования, в ядре должны быть реализованы элементы файловой системы :22:25

7 Канальные средства взаимодействия Очевидно, что обмен процесса с самим собой через канал большого смысла не имеет, поэтому обычно через канал взаимодействуют два ( или более ) процессов. Процесс, создающий канал, принято называть сервером, а другой процесс - клиентом. Для общения с каналом клиент и сервер должны иметь описатели ( дескрипторы, handles) для чтения и записи. Процесс - сервер получает описатель при создании канала. Процесс - клиент может получить описатели в результате наследования, в том случае, когда клиент является потомком сервера. Это типично для общения через так называемые анонимные каналы. Другой способ получения - открытие по имени уже существующего именованного канала неродственным процессом, который в результате также становится обладателем необходимых описателей. Если организация доступа к каналу прошла успешно, то схема взаимодействия может выглядеть так : :22:25

Типовые схемы обмена 8 Одноканальная схема обмена клиент-сервер Двухканальный двунаправленный обмен двух процессов Доступ к данным при любом варианте канального обмена осуществляется через канальные дескрипторы чтения в записи. Канальные дескрипторы похожи на пользовательские дескрипторы открытых файлов в контексте процесса и связаны со входами канала по чтению в записи. Канал открыт для обмена, пока существует связанная с ним пара канальных дескрипторов :22:25

Формальная модель канала. Системный вызов pipe() 9 Формальной моделью канала является кольцевая очередь с дисциплиной обслуживания FIFO. Состояние канальной очереди определяется указателями чтения и записи, которые доступны через дескрипторы канала. Системный вызов pipe Прототип системного вызова int pipe(int *fd); /* #include */ Системный вызов pipe предназначен для создания pip'а внутри ОС. Параметр fd является указателем на массив из двух целых переменных: fd[0] –файловый дескриптор выходного потока данных pipа и позволяющий выполнять только операцию чтения; fd[1] –файловый дескриптор, соответствующий входному потоку данных и позволяющий выполнять только операцию записи. Системный вызов возвращает значение 0 при нормальном завершении и значение - 1 при возникновении ошибок :22:25

Пример использования неименованного канала в Unix 10 #include int main() { int fd[2], result; size_t size; char resstring[14]; /* Попытаемся создать pipe */ if(pipe(fd) < 0) {printf("Can\'t create pipe\n"); exit(-1); } /* Порождаем новый процесс */ result = fork(); if (result > 0) { /* Мы находимся в родительском процессе, входной поток данных нам не понадобится, поэтому закрываем его.*/ close(fd[0]); /* Пробуем записать в pipe 14 байт */ size = write(fd[1], "Hello, world!", 14); /* Закрываем входной поток данных */ close(fd[1]); printf("Parent exit\n"); } else { /* Мы находимся в порожденном процессе, выходной поток данных нам не понадобится, поэтому закрываем его.*/ close(fd[1]); /* Пробуем прочитать из pip'а 14 байт в массив*/ size = read(fd[0], resstring, 14); printf("%s\n",resstring); /* Закрываем входной поток и завершаем работу */ close(fd[0]); } return 0; } :22:25

Особенности поведения функций при работе с pipe() 11 СитуацияПоведение Попытка прочитать меньше байт, чем есть в наличии в канале связи. Читает требуемое количество байт. Прочитанная информация удаляется. В канале связи находится меньше байт, чем затребовано, но не нулевое количество. Читает все, что есть в канале связи, и возвращает значение, соответствующее прочитанному количеству. Прочитанная информация удаляется из канала связи. Попытка читать из канала связи, в котором нет информации. Блокировка вызова разрешена. Вызов блокируется до тех пор, пока не появится информация в канале связи Попытка читать из канала связи, в котором нет информации. Блокировка вызова не разрешена. Если есть процессы, у которых канал связи открыт для записи, системный вызов возвращает значение -1 и устанавливает переменную errno в значение EAGAIN. Если таких процессов нет, системный вызов возвращает значение 0. Системный вызов read() :22:25

12 Системный вызов write() СитуацияПоведение Попытка записать в канал связи меньше байт, чем осталось до его заполнения. Требуемое количество байт помещается в канал связи. Попытка записать в канал связи больше байт, чем осталось до его заполнения. Блокировка вызова разрешена. Вызов блокируется до тех пор, пока все данные не будут помещены в канал связи. Если размер буфера канала связи меньше, чем передаваемое количество информации, то вызов тем самым будет ждать, пока часть информации не будет считана из канала связи. Попытка записать в канал связи больше байт, чем осталось до его заполнения, но меньше, чем размер буфера канала связи. Блокировка вызова запрещена. Системный вызов возвращает значение -1 и устанавливает переменную errno в значение EAGAIN. В канале связи есть место. Попытка записать в канал связи больше байт, чем осталось до его заполнения, и больше, чем размер буфера канала связи. Блокировка вызова запрещена. Записывается столько байт, сколько осталось до заполнения канала. Системный вызов возвращает количество записанных байт. Особенности поведения функций при работе с pipe() :22:25

Организация каналов в О C Windows. Анонимные каналы Анонимные каналы в Windows - это полудуплексное средство потоковой передачи байтов между родственными процессами. Они функционируют в пределах локальной вычислительной системы и хорошо подходят для перенаправления выходного потока одной программы на вход другой. Анонимные каналы реализованы при помощи именованных каналов с уникальными именами. Анонимные каналы создаются процессом сервером при помощи функции CreatePipe: BOOL CreatePipe( PHANDLE hReadPipe, // описатель для чтения PHANDLE hWritePipe, // описатель для записи LPSECURITY_ATTRIBUTES lpPipeAttributes, // атрибуты безопасности DWORD nSize // размер канала ); Функция CreatePipe возвращает два описателя ( дескриптора ) для чтения и записи в канал. После создания канала необходимо передать клиентскому процессу эти дескрипторы ( или один из них ), что обычно делается с помощью механизма наследования :22:25 13

Организация каналов в О C Windows. Анонимные каналы Для наследования описателя нужно, чтобы дочерний процесс создавался функцией CreateProcess с флагом наследования TRUE. Предварительно нужно создать наследуемые описатели. Это можно, например, сделать путем явной спецификации параметра bInheritHandle структуры SECURITY_ATTRIBUTES при создании канала. Другим способом является создание наследуемого дубликата имеющегося описателя при помощи функции DuplicateHandle и последующая передача его создаваемому процессу через командную строку или каким - либо иным образом. Получив нужный описатель, клиентский процесс, так же как и сервер, может далее взаимодействовать с каналом при помощи функций ReadFile и WriteFile. По окончании работы с каналом оба процесса должны закрыть описатели при помощи функции CloseHandle :22:25 14

Пример программы общения процесса через анонимный канал с самим собой :22:25 15 #include #include int main() { HANDLE hRead, hWrite; char BufIn[100], *BufOut = " "; int BufSize = 100; int BytesOut = 10, BytesIn = 5, i; if(!CreatePipe(&hRead, &hWrite, NULL, BufSize)) printf("Create pipe failed.\n"); WriteFile(hWrite, BufOut, BytesOut, &BytesOut, NULL); printf("Write into pipe %d bytes : ", BytesOut); for(i=0; i

Именованные каналы в Windiows Именованные каналы являются объектами ядра ОС Windows, позволяющими организовать межпроцессный обмен не только в изолированной вычислительной системе, но и в локальной сети. Они обеспечивают дуплексную связь и позволяют использовать как потоковую модель, так и модель, ориентированную на сообщения. Обмен данными может быть синхронным и асинхронным. Каналы должны иметь уникальные в рамках сети имена в соответствии с правилами именования ресурсов в сетях Windows (Universal Naming Convention, UNC), например, \\ServerName\pipe\PipeName. Для общения внутри одного компьютера имя записывается в форме \\.\pipe\PipeName, где "." обозначает локальную машину. Слово "pipe" в составе имени фиксировано, а PipeName - имя, задаваемое пользователем. Эти имена, подобно именам открытых файлов, не являются именами объектов. Они относятся к пространству имен под управлением драйверов файловых систем именованных каналов (\Winnt\System32\Drivers\Npfs.sys), привязанному к специальному объекту устройству \Device\NamedPipe, на которое есть ссылка в каталоге глобальных имен объектов. Поскольку имена каналов интегрированы в общую структуру имен объектов, приложения могут открывать именованные каналы с помощью функции CreateFile и взаимодействовать с ними через функции ReadFile и WriteFile :22:25 16

Использование именованных каналов в Windows Сервер создает именованный канал при помощи функции CreateNamedPipe. HANDLE CreateNamedPipe( LPCTSTR lpName,// pointer to pipe name DWORD dwOpenMode,// pipe open mode DWORD dwPipeMode,// pipe-specific modes DWORD nMaxInstances,// maximum number of instances DWORD nOutBufferSize,// output buffer size, in bytes DWORD nInBufferSize,// input buffer size, in bytes DWORD nDefaultTimeOut,// time-out time, in milliseconds LPSECURITY_ATTRIBUTES lpSecurityAttributes // pointer to security attributes structure ); Помимо имени канала в форме, описанной выше, в число параметров функции входят : флаг, указывающий модель передачи данных ; параметр, определяющий синхронный или асинхронный режим работы канала, а также указывающий, должен ли канал быть односторонним или двухсторонним. Кроме того, имеется необязательный дескриптор защиты, запрещающий несанкционированный доступ к именованному каналу, и параметр, определяющий максимальное число одновременных соединений по данному каналу :22:25 17

Использование именованных каналов в Windows После вызова CreateNamedPipe сервер выполняет вызов ConnectNamedPipe и ждет отклика от клиентов, которые соединяются с каналом при помощи функции CreateFile или CallNamedPipe, указывая при вызове имя созданного сервером канала. Легальный клиент получает описатель, представляющий клиентскую сторону именованного канала, и работа серверной функции ConnectNamedPipe на этом завершается. После того как соединение по именованному каналу установлено, клиент и сервер могут использовать его для чтения и записи данных через Win32- функции ReadFile и WritePile. Пример программы клиента : #include void main() { HANDLE hPipe; LPTSTR PipeName = TEXT("\\\\.\\pipe\\MyPipe"); DWORD NumBytesToWrite;char Buff[] = "Message from Client"; hPipe = CreateFile( PipeName, // имя канала GENERIC_READ | // чтение и запись в канал GENERIC_WRITE, 0, // нет разделяемых операций NULL, // защита по умолчанию OPEN_EXISTING, // открытие существующего канала 0, // атрибуты по умолчанию NULL); // нет дополнительных атрибутов WriteFile(hPipe, Buff, strlen(Buff), &NumBytesToWrite, NULL); } :22:25 18

Использование именованных каналов в Windows :22:25 19 #include void main() { PROCESS_INFORMATION piProcInfo; STARTUPINFO SI; char * ClientName = "client.exe"; HANDLE hPipe; LPTSTR PipeName = TEXT("\\\\.\\pipe\\MyPipe"); char Buff[255]; DWORD iNumBytesToRead = 255, i; ZeroMemory(&SI, sizeof(STARTUPINFO)); SI.cb = sizeof(STARTUPINFO); ZeroMemory(&piProcInfo, sizeof(piProcInfo)); hPipe = CreateNamedPipe( PipeName, // имя канала PIPE_ACCESS_DUPLEX, // чтение и запись из канала PIPE_TYPE_MESSAGE | // передача сообщений по каналу PIPE_READMODE_MESSAGE | // режим чтения сообщений PIPE_WAIT, // синхронная передача сообщений PIPE_UNLIMITED_INSTANCES, // число экземпляров канала 4096, // размер выходного буфера 4096, // размер входного буфера NMPWAIT_USE_DEFAULT_WAIT, // тайм-аут клиента NULL); // защита по умолчанию

Использование именованных каналов в Windows :22:25 20 if (hPipe == INVALID_HANDLE_VALUE) { printf("CreatePipe failed: error code %d\n", (int)GetLastError()); return; } if((CreateProcess(NULL, ClientName, NULL, NULL, FALSE, 0, NULL, NULL, &SI, &piProcInfo))==0){ printf("create client process: error code %d\n", (int)GetLastError()); return; } if((ConnectNamedPipe(hPipe, NULL))==0) { printf("client could not connect\n"); return; } ReadFile(hPipe, Buff, iNumBytesToRead, &iNumBytesToRead, NULL); for(i=0; i

Сигналы и прерывания 21 Термины сигнал и прерывание в контексте ОС UNIX являются синонимами: оба означают сообщения, посылаемые операционной системой выполняющимся процессам. Системный вызов kill() предназначен для передачи сигнала одному или нескольким специфицированным процессам в рамках полномочий пользователя. Послать сигнал (не имея полномочий суперпользователя) можно только процессу, у которого эффективный идентификатор пользователя совпадает с эффективным идентификатором пользователя для процесса, посылающего сигнал. int kill (pid, sig) int pid, sig; где pid - это идентификатор процесса, которому посылается сигнал, а sig - целое число от 1 до 19, обозначающее посылаемый сигнал. Название kill является некоторым преувеличением - далеко не все сигналы смертельны :22:25

22 Аргумент pid описывает, кому посылается сигнал, а аргумент sig – какой сигнал посылается. Если pid > 0 и sig > 0, то сигнал номером sig (если позволяют привилегии) посылается процессу с идентификатором pid. Если pid = 0, а sig > 0, то сигнал с номером sig посылается всем процессам в группе, к которой принадлежит посылающий процесс. Если pid = -1, sig > 0 и посылающий процесс не является процессом суперпользователя, то сигнал посылается всем процессам в системе, для которых идентификатор пользователя совпадает с эффективным идентификатором пользователя процесса, посылающего сигнал. Если pid = -1, sig > 0 и посылающий процесс является процессом суперпользователя, то сигнал посылается всем процессам в системе, за исключением системных процессов Если pid 0, то сигнал посылается всем процессам из группы, идентификатор которой равен абсолютному значению аргумента pid. Если значение sig = 0, то производится проверка на ошибку, а сигнал не посылается, так как все сигналы имеют номера > 0. Это можно использовать для проверки правильности аргумента pid (есть ли в системе процесс или группа процессов с соответствующим идентификатором). Возвращаемое значение Системный вызов возвращает 0 при нормальном завершении и –1 при ошибке. Сигналы и прерывания :22:25

Перечень основных сигналов Unix 23 #define SIGHUP 1 /* Освобождение линии */ # define SIGINT 2 /* Прерывание */ # define SIGQUIT 3 /* Выход */ # define SIGILL 4 /* Некорректная команда. Не переустанавливается при перехвате */ # define SIGTRAP 5 /* Трассировочное прерывание. */ # define SIGIOT 6 /* Машинная команда IOT */ #define SIGABRT 6 /* Рекомендуемый синоним предыдущего */ # define SIGEMT 7 /* Машинная команда EMT */ #define SIGFPE 8 /* Исключительная ситуация при выполнении операции с вещественными числами */ # define SIGKILL 9 /* Уничтожение процесса. Не перехватывается и не игнорируется */ # define SIGBUS 10 /* Ошибка шины */ # define SIGSEGV 11 /* Некорректное обращение к сегменту памяти */ # define SIGSYS 12 /* Некорректный параметр системного вызова */ # define SIGPIPE 13 /* Запись в канал, из которого некому читать */ # define SIGALRM 14 /* Будильник */ # define SIGTERM 15 /* Программный сигнал завершения */ # define SIGUSR1 16 /* Определяемый пользователем сигнал 1 */ # define SIGUSR2 17 /* Определяемый пользователем сигнал 2 */ # define SIGCLD 18 /* Завершение порожденного процесса */ # define SIGPWR 19 /* Ошибка питания */ #define SIGWIND 20 /* Изменение окна */ # define NSIG 23 /* Максимально допустимый номер сигнала :22:25

Системный вызов signal(). Установка собственного обработчика сигнала 24 С помощью системного вызова signal() можно выбрать один из трех возможных способов реакции на получаемые сигналы: установить стандартную реакцию на сигнал. игнорировать сигнал. задать собственную функцию для обработки сигнала. #include void (*signal (int sig, void (*handler) (int)))(int); Функция возвращает указатель на функцию с одним параметром типа int, которая ничего не возвращает, и имеющая два параметра: параметр sig типа int и параметр handler, служащий указателем на ничего не возвращающую функцию с одним параметром типа int. sig – это номер сигнала, обработку которого предстоит изменить. handler - описывает новый способ обработки сигнала (указатель на пользовательскую функцию обработчик сигнала, SIG_DFL или SIG_IGN). SIG_IGN процесс игнорир etn поступившие сигналы с номером sig ; SIG_DFL – восстановлени t реакции процесса на этот сигнал по умолчанию :22:25

Пример обработки сигнала в Unix 25 /* Программа с пользовательской обработкой сигнала SIGINT */ #include /* Функция my_handler – пользовательский обработчик сигнала */ void my_handler(int nsig){ printf("Receive signal %d, CTRL-C pressed\n", nsig); } int main(void){ /* Выставляем реакцию процесса на сигнал SIGINT */ (void)signal(SIGINT, my_handler); /*Начиная с этого места, процесс будет печатать сообщение о возникновении сигнала SIGINT */ while(1); return 0; } /* Программа, игнорирующая сигнал SIGINT */ #include int main(void){ /* Выставляем реакцию процесса на сигнал SIGINT на игнорирование */ (void)signal(SIGINT,SIG_IGN); /*Начиная с этого места, процесс будет игнорировать сигнал SIGINT */ while(1); return 0; } :22:25

Обмен сообщениями в Windows 26 Общий синтаксис для декларации обработчика сообщений Windows: procedure Handler_Name(var Msg : MessageType); message WM_XXXXX Handler_Name обозначает имя метода; Msg - имя передаваемого параметра; MessageType - какой либо тип записи, подходящий для данного сообщения; директива message указывает, что данный метод является обработчиком сообщения; WM_XXXXX - константа или выражение, которое определяет номер обрабатываемого сообщения Windows. LRESULT SendMessage( HWND hWnd,// handle of destination window UINT Msg,// message to send WPARAM wParam,// first message parameter LPARAM lParam // second message parameter ); Изменения в состоянии аппаратных средств, самой операционной системе, других исполняющихся в данный момент приложениях, которые могут оказать воздействие на ход выполнения задачи, называются событиями. Приложения извещаются о событиях через сообщения, которые им посылает Windows :22:25

Пример программы обмена сообщениями в Windows 27 procedure MyWwork; Var handle : integer; Begin … handle:=FindWindow(TForm1',Лабораторная работа'); SendMessage(handle,WM_READDATA,0,0); … End. const WM_DATACHANGE = WM_USER ; type TForm1 = class(TForm) private procedure DataChange (Var Message : TMessage); message WM_DATACHANGE; end; procedure TTestForm.DataChange (Var Message : TMessage); var FP, LP :Longint; Begin FP:=Message.Lparam; SP:=Message.Wparam;... End; :22:25

Обработка всех сообщений, которые получает приложение 28 Для этого используется свойство OnMessage объекта Application. Если определен обработчик события OnMessage, то он получает управление при любом событии, сообщение о котором направлено в программу. Следующий код будет приводить к появлению диалога при двойном щелчке мыши на любом объекте в приложении. procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage:=AOM; end; procedure TForm1.AOM(var Msg: TMsg; var Handled: Boolean); begin Handled:=False; if Msg.Message = WM_LBUTTONDBLCLK then begin MessageDlg('Double click.', mtInformation, [mbOK], 0); Handled:=True; end; :22:25