单次会话

【勇芳软件工作室】汉化HomePreviousNext

客户端应用程序通过调用DdeConnect函数并指定字符串句柄来标识包含服务器应用程序的服务名称和对话主题名称的字符串句柄,来请求与服务器的单个对话。DDEML通过将XTYP_CONNECT事务发送到已经注册了与DdeConnect中指定的服务名称相匹配的服务名称或通过调用DdeNameService关闭服务名称过滤的每个服务器应用程序的DDE回调函数进行响应。服务器还可以通过在DdeInitialize函数中指定CBF_FAIL_CONNECTIONS过滤器标志来过滤XTYP_CONNECT事务。在XTYP_CONNECT事务期间,DDEML将服务名称和主题名称传递给服务器。服务器必须检查名称,如果它支持服务名称和主题名称对,则返回TRUE,否则返回FALSE。

如果没有服务器对客户端的连接请求作出积极回应,客户端将从DdeConnect收到NULL,并且不会建立对话。如果服务器返回TRUE,则会建立一个会话,并且客户端接收一个会话句子__一个用于标识会话的双字值。客户端在随后的DDEML调用中使用句柄从服务器获取数据。服务器接收XTYP_CONNECT_CONFIRM事务(除非服务器指定了CBF_SKIP_CONNECT_CONFIRMS过滤器标志)。此事务将会话句柄传递到服务器。

以下示例使用可识别服务名称MyServer的服务器请求系统主题上的对话。【hszServName】【hszSysTopic】参数是先前创建的字符串句柄。

HCONV hConv; /* conversation handle */

HWND hwndParent; /* parent window handle */

HSZ hszServName; /* service name string handle */

HSZ hszSysTopic; /* System topic string handle */

.

.

hConv = DdeConnect(

idInst,/ *实例标识符* /en

hszServName,/ *服务名字符串句柄* /

hszSysTopic,/ *系统主题字符串句柄* /

(PCONVCONTEXT) NULL); /* use default context */

if (hConv == NULL) {

MessageBox(hwndParent,“MyServer不可用”,

(LPSTR) NULL, MB_OK);

return FALSE;

}

.

.

.

在上述示例中,DdeConnect会导致MyServer应用程序的DDE回调函数接收XTYP_CONNECT事务。

在以下示例中,服务器通过比较主题名称字符串句柄传递给服务器的主题名称字符串处理服务器支持的主题名称字符串数组中的每个元素来响应XTYP_CONNECT事务。如果服务器找到匹配项,则会建立对话。

#define CTOPICS 5

HSZ hsz1; /* string handle passed by DDEML */

HSZ ahszTopics[CTOPICS]; /* array of supported topics */

int i; /* loop counter */

.

./ *使用switch语句来检查事务类型。*/

.

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 */

.

./ *处理其他事务类型。*/

.

如果服务器响应XTYP_CONNECT事务返回TRUE,则DDEML会向服务器的DDE回调函数发送一个XTYP_CONNECT_CONFIRM事务。服务器可以通过处理此事务获取会话的句柄。

客户端可以通过在调用DdeConnect中为服务名称字符串句柄,主题名称字符串句柄或两者指定NULL来建立通配符对话。如果至少有一个字符串句柄为NULL,则DDEML将XTYP_WILDCONNECT事务发送到所有DDE应用程序的回调函数(除了过滤XTYP_WILDCONNECT事务的那些)。每个服务器应用程序应该通过返回一个标识HSZPAIR结构的以null结尾的数组的数据句柄来进行响应。如果服务器应用程序尚未调用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;

WORD i, j;

if (uType == XTYP_WILDCONNECT) {

/*

*扫描主题列表并创建一个HSZPAIR阵列

*结构。

*/

j = 0;

for (i = 0; i < CTOPICS; i++) {

if (hszTopic == (HSZ) NULL ||

hszTopic == ahszTopicList[i]) {

ahszp[j].hszSvc = hszServ;

ahszp[j++].hszTopic = ahszTopicList[i];

}

}

/*

*使用包含NULL的HSZPAIR结构结束列表

*字符串句柄作为其成员。

*/

ahszp[j].hszSvc = NULL;

ahszp[j++].hszTopic = NULL;

/*

*返回一个包含该对象的全局内存对象的句柄

* HSZPAIR结构。

*/

返回DdeCreateDataHandle(

idInst,/ *实例标识符* /en

(LPBYTE)& ahszp,/ *指向HSZPAIR数组* /

sizeof(HSZ)* j,/ *数组长度* /

0,/ *从头开始* /

(HSZ)NULL,/ *没有项目名称的字符串* /

0,/ *返回相同的格式* /

0); /* let the system own it */

}

客户端或服务器可以随时通过调用DdeDisconnect功能终止对话。此函数使对话中的伙伴的回调函数接收XTYP_DISCONNECT事务(除非合作伙伴指定了CBF_SKIP_DISCONNECTS过滤器标志)。通常,应用程序通过使用DdeQueryConvInfo函数来获取有关终止对话的信息来响应XTYP_DISCONNECT事务。回调函数从处理XTYP_DISCONNECT事务返回后,会话句柄不再有效。

在其DDE回调函数中接收XTYP_DISCONNECT事务的客户端应用程序可以通过调用DdeReconnect功能来尝试重新建立会话。客户端必须从其DDE回调函数内调用DdeReconnect.