На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Notifying the Client that Data Has Changed



When the client establishes a link by using the WM_DDE_ADVISE message, with the fDeferUpd member not set (that is, equal to zero) in the DDEDATA structure, the client has requested the server send the data item each time the item's value changes. In such cases, the server renders the new value of the data item in the previously specified format and sends the client a WM_DDE_DATA message, as shown in the following example.

/*
* Allocate the size of a DDE data header, plus data (a string),
* plus a
*/

if (!(hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
sizeof(DDEDATA) + lstrlen(szItemValue) + 3)))
return;
if (!(lpData = (DDEDATA FAR*) GlobalLock(hData))) {
GlobalFree(hData);
return;
}

lpData->fAckReq = bAckRequest; /* as specified in original */
/* WM_DDE_ADVISE message */
lpData->cfFormat = CF_TEXT;

lstrcpy(lpData->Value, szItemValue); /* copies value to be sent */
lstrcat(lpData->Value, "\r\n"); /* CR/LF for CF_TEXT format */
GlobalUnlock(hData);
if ((atomItem = GlobalAddAtom(szItemName)) != 0) {
if (!PostMessage(hwndClientDDE,
WM_DDE_DATA,
(WPARAM) hwndServerDDE,
PackDDElParam(WM_DDE_DATA, (UINT) hData, atomItem))) {
GlobalFree(hData);
GlobalDeleteAtom(atomItem);
FreeDDElParam(WM_DDE_DATA, lParam);

}
}

if (atomItem == 0) {

.
. /* error handling */
.

}


In this example, the client processes the item value as appropriate. If the fAckReq flag for the item is set, the client sends the server a positive WM_DDE_ACK message.
When the client establishes the link, with the fDeferUpd member set (that is, equal to 1), the client has requested that only a notification, not the data itself, be sent each time the data changes. In such cases, when the item value changes, the server does not render the value but simply sends the client a WM_DDE_DATA message with a null data handle, as illustrated in the following example.

if (bDeferUpd) { /* checking whether the flag was originally */
/* set in the WM_DDE_ADVISE message */
if ((atomItem = GlobalAddAtom(szItemName)) != 0) {
if (!PostMessage(hwndClientDDE,
WM_DDE_DATA,
(WPARAM) hwndServerDDE,
PackDDElParam(WM_DDE_DATA, 0,
atomItem))) { /* NULL data */
GlobalDeleteAtom(atomItem);
FreeDDElParam(WM_DDE_DATA, lParam);

}
}
}

if (atomItem == 0) {

.
. /* error handling */
.

}


As necessary, the client can request the latest value of the data item by issuing a normal WM_DDE_REQUEST message, or it can simply ignore the notice from the server that the data has changed. In either case, if fAckReq is equal to 1, the client is expected to send a positive WM_DDE_ACK message to the server.


Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Уведомление Клиента, что Данные Изменили



Когда клиент устанавливает связь используя сообщение WM_DDE_ADVISE, с элементом fDeferUpd не установленным (то есть, равный нулю) в структуре DDEDATA, клиент запросился, сервер посылает пункт данных всякий раз, когда изменения величины пункта. В таких случаях, сервер предоставляет новую величину пункта данных в прежде определенный формат и посылает клиенту сообщение WM_DDE_DATA, как показано в следующем примере.

/*
* Распределите размер заголовка данных DDE, плюс данные ( строка),
* плюс
*/

если (!Возврат (hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(DDEDATA) + lstrlen(szItemValue) + 3)));
если (!(lpData = (DDEDATA ЗНАЧИТЕЛЬНО*) GlobalLock(hData))) { GlobalFree(hData);
возврат;
}

lpData->fAckReq = bAckRequest; /* как определено в подлиннике */ /* сообщение WM_DDE_ADVISE */ lpData->cfFormat = CF_TEXT;

lstrcpy(lpData->Value, szItemValue); /* величина копий, чтобы быть посланн */ lstrcat(lpData->Value, "\r\n"); /* CR/LF ДЛЯ формата CF_TEXT */ GlobalUnlock(hData);
если ((atomItem = GlobalAddAtom(szItemName)) != 0) { если (!PostMessage(hwndClientDDE, WM_DDE_DATA, (WPARAM) hwndServerDDE, PackDDElParam(WM_DDE_DATA, (UINT) hData, atomItem))) { GlobalFree(hData);
GlobalDeleteAtom(atomItem);
FreeDDElParam(WM_DDE_DATA, lParam);

}
}

если (atomItem == 0) {

.
. /* обработка ошибки */
.

}


В этом примере, клиент обрабатывает величину пункта как подходящий. Если флаг fAckReq для пункта установлен, клиент посылает серверу положительное сообщение WM_DDE_ACK.
Когда клиент устанавливает связь, с элементом fDeferUpd установленным (то есть, равный 1), клиент запросил, что только уведомление, не сами данные, послано всякий раз, когда данные изменяется. В таких случаях, когда величина пункта изменяется, сервер не предоставляет величину но просто посылает клиенту сообщение WM_DDE_DATA с недействительной ручкой данных, как проиллюстрировано в следующем примере.

если (bDeferUpd) { /* проверяя независимо флаг было первоначально */ /* установитесь в сообщении WM_DDE_ADVISE */ если ((atomItem = GlobalAddAtom(szItemName)) != 0) { если (!PostMessage(hwndClientDDE, WM_DDE_DATA, (WPARAM) hwndServerDDE, PackDDElParam(WM_DDE_DATA, 0, atomItem))) { /* НЕДЕЙСТВИТЕЛЬНЫЕ данные */ GlobalDeleteAtom(atomItem);
FreeDDElParam(WM_DDE_DATA, lParam);

}
}
}

если (atomItem == 0) {

.
. /* обработка ошибки */
.

}


Как необходимый, клиент может запросить самую последнюю величину пункта данных выпуская нормальное сообщение WM_DDE_REQUEST, или это может просто проигнорировать уведомление из сервера, который данные изменили. В любом случае, если fAckReq равняется 1, ожидается, что клиент пошлет положительное сообщение WM_DDE_ACK в сервер.


Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz