Здавалка
Главная | Обратная связь

Передача данных через сообщения



Немного ранее обсуждались способы передачи сообщений (п. 5.2.1 и 5.2.2). Говорилось, что помимо кода сообщения в параметрах wParam и lParam можно передать дополнительную информацию, необходимую для обработки данного сообщения. К примеру, следующий код пытается изменить заголовок заданного окна на «Test»:

SendMessage(hWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)"Test");

В lParam передается адрес строки (с новым заголовком), расположенной в адресном пространстве вызывающего процесса. Следовательно, если окно принадлежит вызывающему процессу, то нарушение доступа к памяти не возникнет, так как все потоки используют общее адресное пространство процесса. Однако если окно принадлежи другому процессу действия, выполняемые операционной системой, усложняются.

Дело в том, что система отслеживает такие сообщения, как WM_SETTEXT, и обрабатывает их не так, как большинство других сообщений. При вызове SendMessage внутренний код функции проверяет факт межпроцессного обращения. Если это так, функция копирует строку из адресного пространства вызывающего процесса в объект ядра «проекция файла» и делает его доступным другому процессу. Затем сообщение посылается потоку другого процесса. Когда поток-приемник готов к обработке WM_SETTEXT, он получает доступ к объекту-проекции, который содержит копию строки. Параметру lParam присваивается значение именно этого (локального) адреса, и WM_SETTEXT направляется нужной оконной процедуре. После обработки этого сообщения, проекция файла уничтожается.

Все так и происходит, если код посылаемого сообщения известен системе. Однако если нужно передать специфический набор данных окну другого процесса, необходимо использовать сообщение WM_COPYDATA:

COPYDATASTRUCT data;

SendMessage(hReceiver, WM_COPYDATA, (WPARAM)hSender, (LPARAM)&data);

При отправке данного сообщения нужно указать окно получателя hReceiver, окно отправителя hSender и указатель на структуру COPYDATASTRUCT данных, которые следует передать. Структура COPYDATASTRUCT определена следующим образом:

typedef struct tagCOPYDATASTRUCT

{

ULONG_PTR dwData;

DWORD cbData;

PVOID lpData;

} COPYDATASTRUCT;

Элемент dwData задает число, пересылаемое в другой процесс, lpData – указатель на данные, а cbData – размер (в байтах) пересылаемых данных.

Таким образом, механизм WM_COPYDATA обеспечивает простой и очень удобный способ организации межпроцессного обмена данными.

Ресурсы

Исполняемый модуль может содержать блок данных, который принято называть ресурсами исполняемого модуля (или приложения). Ресурсы загружаются в оперативную память вместе с кодом модуля в адресное пространство процесса. С одной стороны, такой подход позволяет обеспечить высокую скорость доступа к данным, а с другой – сделать исполняемый модуль более независимым, ведь вся необходимая информация находится «под рукой».

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

В Windows API есть набор функций, который позволяет работать с определенными видами (типами) ресурсов. Несмотря на это, есть возможность включать в ресурсы абсолютно любые данные, однако за интерпретацию этих данных отвечает сам разработчик.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.