Читаем Delphi. Трюки и эффекты полностью

Листинг 10.25.

Функция-ловушка

function WndProcHook(code: Integer; wparam: WPARAM;

lparam: LPARAM): LRESULT stdcall;

var

hook_data: ^TCWPStruct;

begin

//Получим доступ к проекции файла

if not GetFileMapping then

begin

//Не удалось получить доступ к проекции файла. Ценой потери

//сообщений не дадим возникнуть ошибкам доступа к памяти

WndProcHook := 0;

Exit;

end;

if code < 0 then

begin

WndProcHook := CallNextHookEx(hook_info^.hook_handle, code,

wParam, lParam);

//Освободим проекцию файла

ReleaseFileMapping;

Exit;

end;

//Можно обрабатывать сообщение

hook_data := Pointer(lParam);

//Обрабатываем только сообщения нужного окна

if hook_data^.hwnd = hook_info^.wnd then

begin

//Заполняем поля структуры в общей области памяти и посылаем

//сообщение окну-шпиону

hook_info^.mess := hook_data^.message;

hook_info^.wParam := hook_data^.wParam;

hook_info^.lParam := hook_data^.lParam;

PostMessage(hook_info^.spy_wnd, WM_SPY_NOTIFY, 0, 0);

end;

//Передаем сообщение для дальнейшей обработки

WndProcHook := CallNextHookEx(hook_info^.hook_handle, code,

wParam, lParam);

//Освободим проекцию файла

ReleaseFileMapping;

end;

Код функции WndProc достаточно прост, поэтому не будем подробно его описывать. Поясним лишь, для чего все-таки GetFileMapping и ReleaseFileMapping вызываются при обработке каждого перехваченного сообщения.

Дело в том, что загрузка DLL в адресное пространство другого процесса отличается от штатной загрузки библиотеки, например, при помощи функции LoadLibrary: не вызывается код инициализации. Следовательно, мы не можем, например, обнулить указатель hookinf о или установить еще какой-либо признак того, была ли открыта проекция файла. Велика вероятность того, что без отсутствия ручной инициализации указатель hookinf о не будет равен нулю. Как тогда определить, связан ли этот указатель с областью памяти, куда спроецирован файл?

Можно было бы, конечно, завести 64-битную или более переменную, которой присваивалось бы «магическое» число при первой инициализации указателя hookinf о. Но в таком случае работоспособность нашей программы носила бы вероятностный характер.

Речь не идет о том, что в приведенном примере ловушка реализована самым оптимальным образом, просто альтернатива cGetFileMapping HReleaseFileMapping при написании программы показалась наиболее простой и легко поддающейся объяснению.

Глава 11 Сетевое взаимодействие

• Краткое описание сетевых компонентов

• Простой обмен данными

• Слежение за компьютером по сети

• Многопользовательский разговорник

Организация надежного сетевого взаимодействия между приложениями или компонентами одного приложения зачастую является задачей довольно сложной даже для программиста со значительным опытом работы. Это правда, если пытаться самостоятельно использовать API сетевого взаимодействия, предоставляемый операционной системой (в нашем случае – Windows). Однако с использованием компонентов Delphi, в которых уже реализованы рутинные операции по созданию соединений, пересылке данных, контролю ошибок и т. д., программирование сетевых приложений становится не только простым, но и увлекательным занятием. В данной главе мы рассмотрим несколько примеров создания несложных сетевых приложений, построенных с использованием архитектуры «клиент – сервер».

11.1. Краткое описание сетевых компонентов

В Delphi 7 количество компонентов для программирования самых различных сетевых приложений просто радует глаз (см. вкладки IndyQients и IndyServers). Мы рассмотрим построение приложения на базе только IdTCPServer и IdTCPCLient (написание клиент-серверных приложений с использованием всех сетевых компонентов могло бы занять всю книгу).

Итак, сначала о компоненте сервера IdTCPServer. Для использования возможностей сервера этот компонент нужно поместить на форму (компонент неотображаемый). При настройке компонента полезными являются следующие его свойства:

• Active – активизирует или деактивизирует сервер (по умолчанию False);

Перейти на страницу:

Похожие книги

Оружие современной пехоты. Иллюстрированный справочник Часть I
Оружие современной пехоты. Иллюстрированный справочник Часть I

В книге в популярной форме рассказано о современной системе вооружения пехоты, об истории и путях ее дальнейшего развития, а также об основах устройства оружия. Для более подробного рассмотрения автором отобраны самые распространенные образцы. Издание подготовлено для всех интересующихся историей военной техники и современным боевым оружием. Прим. OCR: Для популярного справочника очень доступно и одновременно подробно рассмотрены варианты оружейной автоматики, типы затворов и т.п. Достаточно, что бы не считать внешнее сходство оружия доказательство его копирования. Качество фотоматериалов к сожалению очень низкое – лучше скана в сети не нашлось.

Семен Леонидович Федосеев

Военное дело / Военная история / Справочники / Технические науки / Военная техника и вооружение / Образование и наука / Словари и Энциклопедии