Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы 60-79.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
28.11 Кб
Скачать

74. Для создания сервера почтового слота используется функция:

HANDLE CreateMailslot

{

LPCTSTR lpName, // имя

DWORD nMaxMessageSize, // максимальный размер

DWORD lReadTimeout, // интервал-тайм аута чтения

LPSECURITY_ATTRIBUTES lpSecurityAttributes // информация о безопасности

);

При успешном выполнении мы получим указатель при неуспешном INVALID_HANDLE_VALUE. Обратите внимание на то, что имя должно быть уникальное. Пробуем:

#include "stdafx.h"

#include "windows.h"

#include "iostream.h"

Void main()

{

HANDLE hsl=NULL;

hsl= CreateMailslot("\\\\.\\mailslot\\hello",0,MAILSLOT_WAIT_FOREVER,NULL);

if (hsl!=INVALID_HANDLE_VALUE)

{

cout << "Ok Created mailslot" << endl;

}

75. Клиент почтового слота должен использоваться функцию CreateFile для открытия слота, но с флагом FILE_SHARE_READ. Потом он может воспользоваться функций WriteFile для записи информации. Смотрим пример:

#include "stdafx.h"

#include "windows.h"

#include "iostream.h"

Void main()

{

HANDLE hf=NULL;

hf=CreateFile("\\\\.\\mailslot\\hello",GENERIC_WRITE,

FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hf!=INVALID_HANDLE_VALUE)

{

cout << "Ok Open" << endl;

char buffer[255];

strcpy(buffer,"hello mail slot");

DWORD dwwr;

if (WriteFile(hf,&buffer,strlen(buffer),&dwwr,NULL)!=0)

{

cout << "OK Write" << endl;

}

}

}

76. После создания можно установить операцию чтения. Так как мы указали что ожидание будет до получения информации программа замрет.

if (hsl!=INVALID_HANDLE_VALUE)

{

cout << "Ok Created mailslot" << endl;

char buffer[255];

DWORD nBytesRead;

if (ReadFile(hsl, &buffer, 255, &nBytesRead, NULL)!=0)

{

cout << "Ok read" << endl;

cout << buffer << endl;

}

}

int i;

cin >> i;

77-78. Простой цикл обработки сообщений состоит из одной функции, которая обращается к каждой из этих трех функций: GetMessage, TranslateMessage и DispatchMessage

MSG msg;

BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)

{

if (bRet == -1)

{

// обработка ошибки и возможный выход из программы

}

else

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

Функция GetMessage извлекает сообщение из очереди и копирует его в структуре типа MSG. Она возвращает значение не нуль, если не сталкивается с сообщением WM_QUIT , при наличии которого она возвращает значение ЛОЖЬ (FALSE) и заканчивает цикл обработки. В однопоточной прикладной программе, завершение цикла обработки сообщений является часто первым шагом в закрытии приложения. Прикладная программа может закончить свой собственный цикл, используя функцию PostQuitMessage, обычно в ответ на сообщение WM_DESTROY в оконной процедуре главного окна приложения.

Если Вы определяете дескриптор окна, как второй параметр GetMessage, из очереди извлекаются только сообщения для заданного окна. Функция GetMessage может также фильтровать сообщения в очереди, извлекая только те сообщения, которые попадают в пределы заданного диапазона значений. Для получения дополнительной информации о фильтрации сообщений, см. статью Фильтрация сообщений.

Цикл обработки сообщений потока должен включать в себя функцию TranslateMessage, если поток должен принять ввод символьной информации от клавиатуры. Система генерирует сообщения виртуальных клавиш (WM_KEYDOWN и WM_KEYUP) каждый раз, когда пользователь нажимает клавишу. Сообщение виртуальной клавиши содержит код виртуальной клавиши, который идентифицирует, какая клавиша была нажата, а не ее символьное значение. Чтобы извлечь это значение, цикл обработки сообщений должен содержать функцию TranslateMessage, которая переводит сообщение виртуальной клавиши в символьное сообщение (WM_CHAR ) и помещает его обратно в очередь сообщений прикладной программы. Символьное сообщение затем может быть забрано после последующего повтора цикла сообщений и отправлено целевой оконной процедуре.

Функция DispatchMessage посылает сообщение оконной процедуре, связанной с дескриптором окна, заданным в структуре MSG. Если дескриптор окна имеет флажок - HWND_TOPMOST, DispatchMessage посылает сообщение оконным процедурам всех окон верхнего уровня в системе. Если дескриптор окна - ПУСТО (NULL), DispatchMessage с сообщением не делает ничего.