动态数据交换

动态数据交换

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

    • 中文名:动态数据交换
    • 外文名:Dynamic Data Exchange
    • 简称:DDE
    • 类型:一种动态数据交换机制

简介

在Windows、OS/2、以及其他的一些作业系统(带有第三方的开发工具)上,动态数据交换(Dynamic Data Exchange,DDE)允许数据在程式间被共享或者通信。例如,当你在你的资料库程式中改变一个表,或者电子製表软体中的数据项时,则这个表或者数据项也需要在你可能使用的其他软体中进行相应的改变。DDE是使用共享记忆体作为公共交换区域并提供应用程式一个协定或者命令集以及讯息格式的进程间通信。DDE使用了客户端/伺服器模型,在这个模型中,应用程式对数据的请求在客户端进行处理,同时应用程式对数据的提供在伺服器端处理。

工作原理

DDE的工作原理是:

两个同时运行的程式间通过DDE方式交换数据时是客户/伺服器关係,一旦客户和伺服器建立起来连线关係,则当伺服器中的数据发生变化后就会马上通知客户。通过DDE方式建立的数据连线通道是双向的,即客户不但能够读取伺服器中的数据,而且可以对其进行修改。

DDE和剪贴簿一样既支持标準数据格式(如文本、点阵图等),又可以支持自定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴簿操作几乎总是用作对用户指定操作的一次性应答,如从选单中选择贴上命令。儘管DDE也可以由用户启动,但它继续发挥作用,一般不必用户进一步干预。

例如:

甲方申请一块全局记忆体,然后把记忆体指针postmessage到乙方,乙方根据收到的指针访问那块全局记忆体。有几个API函式是做这种事的,你在MSDN里查一下 Dde 打头的函式全都出来了。因为是已经淘汰的技术,连MFC都没对他进行封装。很难保证它同样会出现在以后的Windows API中。

内容

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程式而言,项目是一个特定的文本框、标籤或图片框的名称。

交换方式

(1)冷连线(CoolLink):数据交换是一次性数据传输,与剪贴簿相同。当伺服器中的数据发生变化后不通知客户,但客户可以随时从伺服器读写数据;

(2)温连线(WarmLink):当伺服器中的数据发生变化后马上通知客户,客户得到通知后将数据取回;

(3)热连线(HotLink):当伺服器中的数据发生变化后马上通知客户,同时将变化的数据直接送给客户。

DDE客户程式向DDE伺服器程式请求数据时,它必须首先知道伺服器的名称(即DDEService名)、DDE主题名称(Topics名),还要知道请求哪一个数据项的项目名称(Items名)。DDEService名应该具有唯一性,否则容易产生混乱。通常DDEService就是伺服器的程式名称,但不是绝对的,它是由程式设计人员在程式内部设定好的,并不是通过修改程式名称就可以改变的。Topics名和Items名也是由DDEService在其内部设定好的,所有服务程式的Service名、Topics名都是注册在系统中,当一个客户向一个伺服器请求数据时,客户必须向系统报告伺服器的Service名和Topics名。只有当Service名、Topics名与伺服器内部设定的名称一致时,系统才将客户的请求传达给伺服器。

当服务名和Topics名相符时,伺服器马上判断Items名是否合法。如果请求的Item名是伺服器中的合法数据项,伺服器即建立此项连线,建立连线的数据发生数值变化后,伺服器会及时通知客户。一个伺服器可以有多个Topics名,Items名的数量也不受限制。

DDE交换可以发生在单机或网路中不同计算机的应用程式之间。开发者还可以定义定製的DDE数据格式,进行应用程式之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程式都支持DDE。但DDE有个明显的缺点就是,通信效率低下,当通信量较大时数据刷新速度慢,在数据较少时DDE较实用。

编写程式

为了使用方便起见,微软提供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档案正确的系统路径。

相关词条

相关搜索

其它词条