|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Submitting an Item to the Server
The client may send an item value to the server by using the WM_DDE_POKE message. The client renders the item to be sent and sends the WM_DDE_POKE message, as illustrated in the following example.
if (!(hPokeData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (LONG) sizeof(DDEPOKE) + lstrlen(szValue) + 2))) return; if (!(lpPokeData = (DDEPOKE FAR*) GlobalLock(hPokeData))) { GlobalFree(hPokeData); return; } lpPokeData->fRelease = TRUE; lpPokeData->cfFormat = CF_TEXT; lstrcpy((LPSTR) lpPokeData->Value, (LPSTR) szValue); /* Each line of CF_TEXT data is terminated by CR/LF. */ lstrcat((LPSTR) lpPokeData->Value, (LPSTR) "\r\n");
GlobalUnlock(hPokeData); if ((atomItem = GlobalAddAtom((LPSTR) szItem)) != 0) { . . . if (!PostMessage(hwndServerDDE, WM_DDE_POKE, (WPARAM) hwndClientDDE, PackDDElParam(WM_DDE_POKE, (UINT) hPokeData, atomItem))) { GlobalDeleteAtom(atomItem); GlobalFree(hPokeData); } } if (atomItem == 0) { . . /* error handling */
. }
Note that sending data by using a WM_DDE_POKE message is essentially the same as sending it by using WM_DDE_DATA, except that WM_DDE_POKE is sent from the client to the server. If the server is able to accept the data-item value in the format rendered by the client, the server processes the item value as appropriate and sends the client a positive WM_DDE_ACK message. If it is unable to process the item value, because of its format or for other reasons, the server sends the client a negative WM_DDE_ACK message.
UnpackDDElParam(WM_DDE_POKE, lParam, (PUINT) &hPokeData, (PUINT) &atomItem); GlobalGetAtomName(atomItem, szItemName, ITEM_NAME_MAX_SIZE); if (!(lpPokeData = (DDEPOKE FAR*) GlobalLock(hPokeData)) || lpPokeData->cfFormat != CF_TEXT || !IsItemSupportedByServer(szItemName)) { PostMessage(hwndClientDDE, WM_DDE_ACK, (WPARAM) hwndServerDDE, PackDDElParam(WM_DDE_ACK, 0, atomItem)); /* negative ACK */ } lstrcpy(szItemValue, lpPokeData->Value); /* copies value */
bRelease = lpPokeData->fRelease; GlobalUnlock(hPokeData); if (bRelease) { GlobalFree(hPokeData); } PostMessage(hwndClientDDE, WM_DDE_ACK, (WPARAM) hwndServerDDE, PackDDElParam(WM_DDE_ACK, 0x8000, atomItem)); /* positive ACK */
In this example, the server calls GlobalGetAtomName to retrieve the name of the item the client sent. The server then determines whether it supports the item and whether the item is rendered in the correct format (that is, CF_TEXT). If the item is not supported and not rendered in the correct format, or if the server cannot lock the memory for the data, the server sends a negative acknowledgment back to the client application. Note that in this case, sending a negative acknowledgement is correct because WM_DDE_POKE messages are always assumed to have the fAckReq member set. The server should ignore the member.
If a server sends a negative acknowledgement in response to a WM_DDE_POKE message, the client is responsible for freeing the memory (but not the lParam parameter) referenced by the WM_DDE_POKE message associated with the negative acknowledgement.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Подающий Пункт в Сервер
Клиент может послать пункту величину в сервер используя сообщение WM_DDE_POKE. Клиент предоставляет пункт, который нужно посылать и посылал сообщение WM_DDE_POKE, как проиллюстрировано в следующем примере.
если (!ВОЗВРАТ (hPokeData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (ДОЛГО (ДЛИНОЙ)) sizeof(DDEPOKE) + lstrlen(szValue) + 2))); если (!(lpPokeData = (DDEPOKE ЗНАЧИТЕЛЬНО*) GlobalLock(hPokeData))) { GlobalFree(hPokeData); возврат; } lpPokeData->fRelease = ИСТИНА; lpPokeData->cfFormat = CF_TEXT; lstrcpy((LPSTR) lpPokeData->Value, (LPSTR) szValue); /* Каждая строка данных CF_TEXT расторгнутая CR/LF. */ lstrcat((LPSTR) lpPokeData->Value, (LPSTR) "\r\n");
GlobalUnlock(hPokeData); если ((atomItem = GlobalAddAtom((LPSTR) szItem)) != 0) { . . . если (!PostMessage(hwndServerDDE, WM_DDE_POKE, (WPARAM) hwndClientDDE, PackDDElParam(WM_DDE_POKE, (UINT) hPokeData, atomItem))) { GlobalDeleteAtom(atomItem); GlobalFree(hPokeData); } } если (atomItem == 0) { . . /* обработка ошибки */
. }
Отметьте, что посылая данные используя сообщение WM_DDE_POKE по существу такое же как и посылая этому используя WM_DDE_DATA, за исключением того это WM_DDE_POKE послан от клиента до сервера. Если сервер способный принять данные-пункт величины в формате предоставившем клиентом, сервер обрабатывает величину пункта как присваивать и посылает клиенту положительное сообщение WM_DDE_ACK. Если это - не в состоянии обработать величину пункта, из-за своего формата или по другим причинам, сервер посылает клиенту отрицательное сообщение WM_DDE_ACK.
UnpackDDElParam(WM_DDE_POKE, lParam, (PUINT) &hPokeData, (PUINT) &atomItem); GlobalGetAtomName(atomItem, szItemName, ITEM_NAME_MAX_SIZE); если (!(lpPokeData = (DDEPOKE ЗНАЧИТЕЛЬНО*) GlobalLock(hPokeData)) || lpPokeData->cfFormat != CF_TEXT || !IsItemSupportedByServer(szItemName)) { PostMessage(hwndClientDDE, WM_DDE_ACK, (WPARAM) hwndServerDDE, PackDDElParam(WM_DDE_ACK, 0, atomItem)); /* негатив ACK */ } lstrcpy(szItemValue, lpPokeData->Value); /* копии оцениваются */
bRelease = lpPokeData->fRelease; GlobalUnlock(hPokeData); если (bRelease) { GlobalFree(hPokeData); } PostMessage(hwndClientDDE, WM_DDE_ACK, (WPARAM) hwndServerDDE, PackDDElParam(WM_DDE_ACK, 0x8000, atomItem)); /* положительный ACK */
В этом примере, сервер вызывает GlobalGetAtomName, чтобы извлекать имени пункта посланный клиента. Сервер затем определяет поддерживает он пункт и пункт предоставляют в правильном формате (то есть, CF_TEXT). Если пункт не поддерживан и не предоставившее в правильный формат, или если сервер не может запереть память для данных, сервер посылает отрицательное признание в приложение клиента. Отметьте, что в этом случае, посылающем отрицательное подтверждение - правильно поскольку сообщения WM_DDE_POKE всегда приняты, чтобы установлен элемент fAckReq. Сервер должен проигнорировать элемент.
Если сервер посылает отрицательное подтверждение в ответ на сообщение WM_DDE_POKE, клиент ответственный за освобождение памяти (но не параметр lParam) ссылавшееся сообщением WM_DDE_POKE связанным отрицательным подтверждением.
|
|
|
|
| |