
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 с сообщением не делает ничего.