|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Single Conversations
A client application requests a single conversation with a server by calling the DdeConnect function and specifying string handles that identify the strings containing the service name of the server application and the topic name for the conversation. The DDEML responds by sending the XTYP_CONNECT transaction to the DDE callback function of each server application that either has registered a service name that matches the one specified in DdeConnect or has turned service name filtering off by calling DdeNameService. A server can also filter XTYP_CONNECT transactions by specifying the CBF_FAIL_CONNECTIONS filter flag in the DdeInitialize function. During the XTYP_CONNECT transaction, the DDEML passes the service name and the topic name to the server. The server must examine the names and return TRUE if it supports the service name and topic name pair or FALSE if it does not.
If no server responds positively to the client's request to connect, the client receives NULL from DdeConnect and no conversation is established. If a server returns TRUE, a conversation is established and the client receives a conversation handle ѕ a doubleword value that identifies the conversation. The client uses the handle in subsequent DDEML calls to obtain data from the server. The server receives the XTYP_CONNECT_CONFIRM transaction (unless the server specified the CBF_SKIP_CONNECT_CONFIRMS filter flag). This transaction passes the conversation handle to the server.
The following example requests a conversation on the System topic with a server that recognizes the service name MyServer. The hszServName and hszSysTopic parameters are previously created string handles.
HCONV hConv; /* conversation handle */ HWND hwndParent; /* parent window handle */ HSZ hszServName; /* service name string handle */ HSZ hszSysTopic; /* System topic string handle */ . . hConv = DdeConnect( idInst, /* instance identifier */ hszServName, /* service name string handle */ hszSysTopic, /* System topic string handle */ (PCONVCONTEXT) NULL); /* use default context */
if (hConv == NULL) { MessageBox(hwndParent, "MyServer is unavailable.", (LPSTR) NULL, MB_OK); return FALSE; } . . .
In the preceding example, DdeConnect causes the DDE callback function of the MyServer application to receive an XTYP_CONNECT transaction. In the following example, the server responds to the XTYP_CONNECT transaction by comparing the topic name string handle the DDEML passed to the server with each element in the array of topic name string handles the server supports. If the server finds a match, it establishes the conversation.
#define CTOPICS 5 HSZ hsz1; /* string handle passed by DDEML */ HSZ ahszTopics[CTOPICS]; /* array of supported topics */ int i; /* loop counter */ . . /* Use a switch statement to examine transaction types. */ . case XTYP_CONNECT: for (i = 0; i < CTOPICS; i++) { if (hsz1 == ahszTopics[i]) return TRUE; /* establish a conversation */ } return FALSE; /* topic not supported; deny conversation */
. . /* Process other transaction types. */ .
If the server returns TRUE in response to the XTYP_CONNECT transaction, the DDEML sends an XTYP_CONNECT_CONFIRM transaction to the server's DDE callback function. The server can obtain the handle for the conversation by processing this transaction. A client can establish a wildcard conversation by specifying NULL for the service name string handle, the topic name string handle, or both in a call to DdeConnect. If at least one of the string handles is NULL, the DDEML sends the XTYP_WILDCONNECT transaction to the callback functions of all DDE applications (except those that filter the XTYP_WILDCONNECT transaction). Each server application should respond by returning a data handle that identifies a null-terminated array of HSZPAIR structures. If the server application has not called DdeNameService to register its service names and if filtering is on, the server does not receive XTYP_WILDCONNECT transactions. For more information about data handles, see Data Management.
The array must contain one structure for each service name and topic name pair that matches the pair specified by the client. The DDEML selects one of the pairs to establish a conversation and returns to the client a handle that identifies the conversation. The DDEML sends the XTYP_CONNECT_CONFIRM transaction to the server (unless the server filters this transaction). The following example shows a typical server response to the XTYP_WILDCONNECT transaction.
#define CTOPICS 2 UINT uType; HSZPAIR ahszp[(CTOPICS + 1)]; HSZ ahszTopicList[CTOPICS]; HSZ hszServ, hszTopic; WORD i, j; if (uType == XTYP_WILDCONNECT) { /* * Scan the topic list and create an array of HSZPAIR * structures. */ j = 0; for (i = 0; i < CTOPICS; i++) { if (hszTopic == (HSZ) NULL || hszTopic == ahszTopicList[i]) { ahszp[j].hszSvc = hszServ; ahszp[j++].hszTopic = ahszTopicList[i];
} } /* * End the list with an HSZPAIR structure that contains NULL * string handles as its members. */ ahszp[j].hszSvc = NULL; ahszp[j++].hszTopic = NULL; /* * Return a handle to a global memory object containing the * HSZPAIR structures. */ return DdeCreateDataHandle( idInst, /* instance identifier */ (LPBYTE) &ahszp, /* points to HSZPAIR array */
sizeof(HSZ) * j, /* length of the array */ 0, /* start at the beginning */ (HSZ) NULL, /* no item name string */ 0, /* return the same format */ 0); /* let the system own it */ }
Either the client or the server can terminate a conversation at any time by calling the DdeDisconnect function. This function causes the callback function of the partner in the conversation to receive the XTYP_DISCONNECT transaction (unless the partner specified the CBF_SKIP_DISCONNECTS filter flag). Typically, an application responds to the XTYP_DISCONNECT transaction by using the DdeQueryConvInfo function to obtain information about the conversation that terminated. After the callback function returns from processing the XTYP_DISCONNECT transaction, the conversation handle is no longer valid.
A client application that receives an XTYP_DISCONNECT transaction in its DDE callback function can attempt to reestablish the conversation by calling the DdeReconnect function. The client must call DdeReconnect from within its DDE callback function.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Единственная Беседа
Приложение клиента запрашивает единственный разговор с сервером вызывая функцию DdeConnect и определяя ручки строки, что идентифицировать строки, содержащие имя услуги приложения сервера и тема называет в честь разговора. DDEML Отвечает посылая сделку XTYP_CONNECT в функцию возврата DDE каждого приложения сервера, что или зарегистрировал имя услуги, которое соответствует один определенное в DdeConnect или стало именем услуги, фильтрующим вызывая DdeNameService. Сервер может также отфильтровать сделки XTYP_CONNECT определяя флаг фильтра CBF_FAIL_CONNECTIONS в функции DdeInitialize. В течение сделки XTYP_CONNECT, DDEML передает имя услуги и имя темы в сервер. Сервер должен изучить имена и возвращать ИСТИНУ если он поддерживает имя услуги и пары имени темы или ЛЖИ если это нет.
Если никакой сервер не реагирует положительно на запрос клиента, чтобы соединяться, клиент получает НЕДЕЙСТВИТЕЛЬНЫЙ из DdeConnect и никакой разговор не установлен. Если сервер возвращает ИСТИНУ, разговор установлен и клиент получает ручку разговора U величина двойного слова, что идентифицирует разговор. Клиент использует ручку на последующих вызовах DDEML, чтобы получать данные из сервера. Сервер получает сделку XTYP_CONNECT_CONFIRM (если сервер не определял флаг фильтра CBF_SKIP_CONNECT_CONFIRMS). Эта сделка передает ручку разговора в сервер.
Следующий пример запрашивает разговор в теме Системы с сервером, который признает имя услуги MyServer. hszServName И параметры hszSysTopic прежде созданы ручки строки.
HCONV hConv; /* ручка разговора */ HWND hwndParent; /* родительская ручка окна */ HSZ hszServName; /* ручка строки имени услуги */ HSZ hszSysTopic; /* Ручка строки темы Системы */ . . hConv = DdeConnect( idInst, /* Идентификатор примера */ hszServName, /* ручка строки имени услуги */ hszSysTopic, /* ручка строки темы Системы */ (PCONVCONTEXT) НЕДЕЙСТВИТЕЛЬНЫЙ); /* по умолчанию контекст использования */
если (hConv == НЕДЕЙСТВИТЕЛЬНЫЙ) { MessageBox(hwndParent, "MyServer ОТСУТСТВУЕТ.", (LPSTR) НЕДЕЙСТВИТЕЛЬНЫЙ, MB_OK); обратная ЛОЖЬ; } . . .
В предыдущем примере, DdeConnect заставляет функцию возврата DDE приложения MyServer, чтобы получать сделку XTYP_CONNECT. В следующем примере, сервер реагирует на сделку XTYP_CONNECT при сравнении ручки строки имени темы DDEML пройденное в сервер с каждым элементом в массиве ручек строки имени темы опоры сервера. Если сервер находит сопоставление, он устанавливает разговор.
#define CTOPICS 5 hsz1 HSZ; /* ручка строки проходила DDEML */ HSZ ahszTopics[CTOPICS]; /* массив предусмотренных тем */ int i; /* счетчик цикла */ . . /* Используйте утверждение ключа, чтобы изучать сделку types. */ . случай XTYP_CONNECT: для (i = 0; я < CTOPICS; я++) { если (hsz1 == ahszTopics[i]) обратная ИСТИНА; /* установите разговор */ } обратная ЛОЖЬ; /* тема не поддержана; разговор deny */
. . /* Обработайте другую сделку types. */ .
Если сервер возвращает ИСТИНУ в ответ на сделку XTYP_CONNECT, DDEML посылает сделку XTYP_CONNECT_CONFIRM в функцию возврата сервера DDE. Сервер может получить ручку для разговора обрабатывая эту сделку. Клиент может установить разговор шаблона определяя НЕДЕЙСТВИТЕЛЬНЫМ для ручки строки имени услуги, ручка строки имени темы, или в вызове на DdeConnect. Если по крайней мере одна из ручек строки НЕДЕЙСТВИТЕЛЬНА, DDEML посылает сделку XTYP_WILDCONNECT в функции возврата всех приложений DDE (кроме те которые фильтруют сделку XTYP_WILDCONNECT). Каждое приложение сервера должно отвечать возвращав ручку данных, которая идентифицирует недействительный расторгнутый массив структур HSZPAIR. Если приложение сервера не было названо DdeNameService, чтобы регистрировать свои имена услуги и если фильтрация находится на, сервер не получает сделки XTYP_WILDCONNECT. Более подробно о ручках данных, смотри Управление Данных.
Массив должен содержать одну структуру для каждого имени услуги и пара имени темы, что соответствует паре определялся клиентом. DDEML Выбирается одну из пар, чтобы устанавливать разговор и возврат клиенту ручка, которая идентифицирует разговор. DDEML Посылает сделку XTYP_CONNECT_CONFIRM в сервер (если сервер не фильтрует эту сделку). Следующий пример показывает типичный ответ сервера на сделку XTYP_WILDCONNECT.
#define CTOPICS 2 UINT uType; HSZPAIR ahszp[(CTOPICS + 1)]; HSZ ahszTopicList[CTOPICS]; HSZ hszServ, hszTopic; СЛОВО я, j; если (uType == XTYP_WILDCONNECT) { /* * Сканируйте список темы и создавайте массив HSZPAIR * структуры. */ j = 0; для (i = 0; я < CTOPICS; я++) { если (hszTopic == (HSZ) НЕДЕЙСТВИТЕЛЬНЫЙ || hszTopic == ahszTopicList[i]) { ahszp[j].hszSvc = hszServ; ahszp[j++].hszTopic = ahszTopicList[i];
} } /* * Закончите список со структурой HSZPAIR, которая содержит НЕДЕЙСТВИТЕЛЬНЫЙ * ручки строки как участники. */ ahszp[j].hszSvc = НЕДЕЙСТВИТЕЛЬНЫЙ; ahszp[j++].hszTopic = НЕДЕЙСТВИТЕЛЬНЫЙ; /* * Возвращайте ручку на глобальный объект памяти, содержащий the * СТРУКТУРЫ HSZPAIR. */ возврат DdeCreateDataHandle( idInst, /* идентификатор примера */ (LPBYTE) &ahszp, /* точки на массив HSZPAIR */
sizeof(HSZ) * j, /* длина массива */ 0, /* запустите начало */ (HSZ) НЕДЕЙСТВИТЕЛЬНЫЙ, /* никакая строка имени пункта */ 0, /* возвращайте тот же формат */ 0); /* позвольте системный собственный это */ }
Или клиент или сервер может завершить разговор в любое время вызывая функцию DdeDisconnect. Эта функция вызывает функцию возврата партнера в разговор, чтобы получать сделку XTYP_DISCONNECT (если партнер не определял флаг фильтра CBF_SKIP_DISCONNECTS). Обычно, приложение реагирует на сделку XTYP_DISCONNECT используя функцию DdeQueryConvInfo, чтобы получать информацию о разговоре, что завершался. После того, как функция возврата возвращается с обработки сделки XTYP_DISCONNECT, ручка разговора больше правильная.
Приложение клиента, которое получает сделку XTYP_DISCONNECT в своей функции возврата DDE может пытаться reestablish разговор вызывая функцию DdeReconnect. Клиент должен назвать DdeReconnect из своей функции возврата DDE.
|
|
|
|
| |