DDE(动态数据交换)

DDE动态数据交换

DDE是一种动态数据交换机制(Dynamic Data Exchange,DDE)。使用DDE通讯需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。客户机应用程序向当前所激活的服务器应用程序发送一条消息请求信息,服务器应用程序根据该信息作出应答,从而实现两个程序之间的数据交换。

中文名

动态数据交换

外文名

Dynamic Data Exchange

简称

DDE

类型

一种动态数据交换机制

内容

DDE对话的内容是通过三个标识名来约定的。

  1. 应用程序名:进行DDE对话的双方的名称。商业应用程序的名称在产品文档中给出。“组态王”运行系统的程序名是“VIEW”;Microsoft Excel的应用程序名是“Excel”;Visual Basic程序使用的是可执行文件的名称。
  2. 主题:被讨论的数据域(domain)。对“组态王”来说,主题规定为“tagname”;Excel的主题名是电子表格的名称,比如sheetl,sheet2,……;Visual Basic程序的主题由窗体(Form)的LinkTopic属性值指定。
  3. 项目:这是被讨论的特定数据对象。在“组态王”的数据词典里,工程人员定义I/O变量的同时,也定义项目名称。Excel里的项目是单元,比如rlc2(rlc2表示第一行、第二列的单元)。对Visual Basic程序而言,项目是一个特定的文本框、标签或图片框的名称

DDE的应用

DDE技术极大地方便了人们的生活与工作。各个区域目前都运用到了APN技术,并在实践中不断探索,提高APN技术。例如:DDE技术在污水处理控制系统中的应用。为了进一步实现污水处理控制系统的信息化、智能化,完成现场数据的有效传输和设备之间的无缝连接,构建了基于PLC和组态软件的污水处理控制系统架构,利用动态数据交换(DDE)技术实现现场PLC与VB的数据通信,保证现场数据的实时传输。结合倒置A2/O(Anaerobic-Anoxic-Oxic,即厌氧-缺氧-好氧)污水处理工艺流程,设计污水处理自控系统和监控系统,实现对现场设备的控制和生产过程的实时监视。实际结果表明系统运行稳定,具有良好的控制效果。[1]

编写程序

为了使用方便起见,微软提供DDE管理库(TheDDEManagementLibrary,简称DDEML)。DDEML专门协调DDE通信,给DDE应用程序提供句柄字符串和数据交换的服务,消除了早期由于DDE协议不一致所引起的问题。

使用DDEML开发的应用程序(客户/服务器)无论在运行一致性方面,还是在程序相互通信方面,性能均优于没有使用DDEML的应用程序。而且DDEML的应用使得开发支持DDE的应用程序容易了许多,因为DDEML(这是个DLL)担起了内务府总管的工作。使用DDEML后,实际上客户和服务器之间的多数会话并不是直达对方的,而是经由DDEML中转,即用Callback函数处理DDE交易(Transaction),而早期的消息通信是直接的。

在调用其他DDEML函数前,客户/服务器必须调用DdeInitialize()函数,以获取实例标识符,注册DDECallback函数,并为Callback函数指定事务过滤。对于服务器,在使用DdeInitialize()初始化后,调用DdeCreateStringHandle()建立Service名、Topics名和Items名等标识的句柄,再通过DdeNameService()在操作系统中注册服务器的名字。根据这些句柄,客户就可以使用它提供的DDE服务了。

为了执行某个DDE任务,许多DDEML函数需要获得字符串的访问权。例如:一个客户在调用DdeConnect()函数来请求同服务器建立会话时,必须指定Service名和Topics名。可以通过调用DdeCreateStringHandle()函数来获取特定字符串句柄。例如:

HSZhszServName=DdeCreateStringHandle(idInst,"MyServer",CP_WINANSI);

HSZhszSysTopic=DdeCreateStringHandle(idInst,SZDDESYS_TOPIC,CP_WINANSI);

一个应用程序的DDE回调函数在大多DDE事务中接收多个字符串句柄。比如:在XTYP_REQUEST事务处理期间,一个DDE服务器接收两个字符串句柄:一个标识Topics名字符串,另一个标识Items名字符串。可以通过调用DdeQueryString()函数来获取相应于字符串句柄的字符串长度,并且复制字符串到应用程序定义的buffer中。例如:

DWORDidInst;

DWORDcb;

HSZhszServ;

PSTRpszServName;

cb=DdeQueryString(idInst,hszServ,(LPSTR)NULL,0,CP_WINANSI)+1;

pszServName=(PSTR)LocalAlloc(LPTR,(UINT)cb);

DdeQueryString(idInst,hszServ,pszServName,cb,CP_WINANSI);

根据微软MSDN,现有的基于消息DDE协议的应用程序与DDEML应用程序是相容的,也就是说,基于消息通信的DDE应用程序可以与DDEML应用程序对话和交易。在使用DDEML时,必须在源程序文件中包括ddeml.h头文件,连接user32.lib文件,并保证ddeml.dll文件正确的系统路径。

参考资料

1.DDE技术在污水处理控制系统中的应用·中国知网

关键词:DDE