客户端应用程序可以使用DdeConnectList功能来确定感兴趣的任何服务器是否在系统中可用。客户端在调用DdeConnectList时指定服务名称和主题名称,导致DDEML将XTYP_WILDCONNECT事务广播到与服务名称匹配的所有服务器的DDE回调函数(除了过滤事务的服务器)。服务器的回调函数应该返回一个数据句柄,它标识一个以null结尾的HSZPAIR结构的数组。数组应包含与客户端指定的对应的每个服务名称和主题名称对的一个结构。DDEML为服务器填写的每个HSZPAIR结构建立一个会话,并向客户端返回会话列表句柄。服务器通过XTYP_CONNECT _CONFIRM事务接收会话句柄(除非服务器过滤此事务)。
当客户端调用DdeConnectList时,客户端可以为服务名称,主题名称或两者指定NULL。如果服务名称为NULL,系统中支持指定主题名称的所有服务器都将响应。与每个响应服务器建立对话,包括同一服务器的多个实例。如果主题名称为NULL,则在与服务名称匹配的每个服务器识别的每个主题上建立会话。
客户端可以使用DdeQueryNextServer和DdeQueryConvInfo功能来识别响应DdeConnectList的服务器。DdeQueryNextServer返回会话列表中的下一个会话句柄,DdeQueryConvInfo填写一个CONVINFO结构,其中包含有关对话的信息。客户端可以保留所需的对话句柄,并将其余的会话从会话列表中丢弃。
以下示例使用DdeConnectList与支持系统主题的所有服务器建立对话,然后使用DdeQueryNextServer和DdeQueryConvInfo函数获取服务器的服务名称字符串句柄并将其存储在缓冲区中。
HCONVLIST hconvList; /* conversation list */
DWORD idInst; /* instance identifier */
HSZ hszSystem; /* System topic */
HCONV hconv = NULL; /* conversation handle */
CONVINFO ci; /* holds conversation data */
UINT cConv = 0; /* count of conv. handles */
HSZ *pHsz, *aHsz; /* point to string handles */
/ *连接到支持系统主题的所有服务器。*/
hconvList = DdeConnectList(idInst, NULL, hszSystem, NULL, NULL);
/ *计算会话列表中的句柄数。*/
while ((hconv = DdeQueryNextServer(hconvList, hconv)) != NULL)
cConv++;
/ *为字符串句柄分配一个缓冲区。*/
hconv = NULL;
aHsz = (HSZ *) LocalAlloc(LMEM_FIXED, cConv * sizeof(HSZ));
/ *将字符串句柄复制到缓冲区。*/
pHsz = aHsz;
while ((hconv = DdeQueryNextServer(hconvList, hconv)) != NULL) {
DdeQueryConvInfo(hconv, QID_SYNC, (PCONVINFO) &ci);
DdeKeepStringHandle(idInst, ci.hszSvcPartner);
*pHsz++ = ci.hszSvcPartner;
}
.
. /* Use the handles; converse with the servers. */
.
/ *释放内存并终止会话。*/
LocalFree((HANDLE) aHsz);
DdeDisconnectList(hconvList);
应用程序可以通过调用DdeDisconnect函数来终止对话列表中的单个会话。应用程序可以通过调用DdeDisconnectList函数来终止对话列表中的所有会话。这两个功能都使DDEML向每个合作伙伴的DDE回调函数发送XTYP_DISCONNECT事务。DdeDisconnectList为列表中的每个会话句柄发送一个XTYP_DISCONNECT事务。
通过将现有会话列表句柄传递给DdeConnectList,客户端可以检索对话列表中的会话句柄列表。枚举过程从列表中移除终止对话的句柄,并添加适合指定服务名称和主题名称的非复制对话。
如果DdeConnectList指定了现有的会话列表句柄,则该函数将创建一个新的对话列表,其中包含任何新会话的句柄和现有列表中的句柄。
如果存在重复会话,DdeConnectList会尝试阻止会话列表中的重复对话句柄。重复的会话是与同一服务器相同的服务名称和主题名称的第二个对话。两个这样的对话将具有不同的句柄,但它们将识别相同的对话。