客户端应用程序可以使用DDEML来建立与服务器应用程序中的项目的一个或多个链接。当建立这样的链接时,服务器向客户端发送有关链接项目的定期更新(通常,每当与服务器应用程序相关联的项目的值更改时)。链接在两个应用程序之间建立一个建议循环,直到客户端结束为止。
有两种建议循环:“热”和“温暖”。在一个热门建议循环中,服务器立即发送一个数据句柄来标识更改的值。在一个温暖的建议循环中,服务器通知客户该项目的值已更改,但在客户端请求之前不发送数据句柄。
客户端可以通过在DdeClientTransaction的调用中指定XTYP_ADVSTART事务类型来请求与服务器的热门建议循环。要请求温暖的建议循环,客户端必须将XTYPF_NODATA标志与XTYP_ADVSTART事务类型组合。在任一情况下,DDEML将XTYP_ADVSTART事务传递到服务器的DDE回调函数。服务器的DDE回调函数应该检查XTYP_ADVSTART事务(包括所请求的格式,主题名称和项目名称)附带的参数,然后返回TRUE以允许建议循环或FALSE拒绝它。
建议建立循环后,只要与请求的项目名称相关联的项目的值发生变化,服务器应用程序就应该调用DdePostAdvise函数。此调用导致XTYP_ADVREQ事务被发送到服务器自己的DDE回调函数。服务器的DDE回调函数应该返回一个数据句柄,用于标识数据项的新值。然后,DDEML通过将XTYP_ADVDATA事务发送到客户端的DDE回调函数来通知客户指定的项目已更改。
如果客户端请求了一个热门建议循环,则DDEML会在XTYP_ADVDATA事务期间将更改的项目的数据句柄传递给客户端。否则,客户端可以发送XTYP_REQUEST事务来获取数据句柄。
服务器可以比客户端处理新数据更快地发送更新。对于必须对数据执行冗长处理操作的客户端,更新的速度可能是一个问题。在这种情况下,客户端在请求建议循环时应指定XTYPF_ACKREQ标志。该标志使服务器等待客户端确认它在服务器发送下一个数据项之前已经收到并处理了数据项。使用XTYPF_ACKREQ标志建立的建议循环在快速服务器上更加强大,但可能偶尔会错过更新。只要客户端跟上服务器,就保证建立不带XTYPF_ACKREQ标志的建议循环不会错过更新。
客户端可以通过在DdeClientTransaction的调用中指定XTYP_ADVSTOP事务类型来结束建议循环。
如果服务器不支持建议循环,则应在DdeInitialize函数中指定CBF_FAIL_ADVISES过滤器标志。该标志阻止DDEML向服务器发送XTYP_ADVSTART和XTYP_ADVSTOP事务。