动态数据交换(DDE, Dynamic Data Exchange)简介

动态数据交换(DDE, Dynamic Data Exchange)简介

1、简介

 

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

  DDE(Dynamic data exchange)的工作原理是:

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

 

2、交换方式

 

  (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较实用。

 

3、编写程序

 

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

转载于:https://www.cnblogs.com/h2co3orange/archive/2013/01/14/2859888.html

DDE动态数据交换 DDE是一种动态数据交换机制(Dynamic Data ExchangeDDE)。使用DDE通讯需要两个Windows应用程序,其中一个作为服务器处理信息,另外一个作为客户机从服务器获得信息。客户机应用程序向当前所激活的服务器应用程序发送一条消息请求信息,服务器应用程序根据该信息作出应答,从而实现两个程序之间的数据交换。 在LabVIEW6.0以后的版本里,DDE还是可以使用的,但是NI更提倡使用ActiveX,因此DDE的VI不会自动显示在函数模板上。如果使用,可以在labview X.X\\vi.lib\\platform\\dde.llb去找。 DDEDynamic data exchange)的工作原理是: 甲方申请一块全局内存,然后把内存指针postmessage到乙方, 乙方根据收到的指针访问那块全局内存。 有几个API函数是做这种事的,你在MSDN里查一下 Dde 打头的函数全都出来了。 因为是已经淘汰的技术,连MFC都没对他进行封装。 很难保证它同样会出现在以后的Windows API中。 DDE = Dynamic Data Exchange,是 16 位 Windows 时代实现不同应用程序之间互相交换数据和控制的技术,现在用得很少了,Windows Shell 外壳打开某些文件类型还用到 DDE。 OLE = Object Linking and Embedding,从 16 位 Windows 时代发展而来,建立在 COM 基础之上(实际上 OLE 是 COM 的第一个实际应用,OLE 标准推出时,COM 标准还没有定型;COM 的成熟取决于 OLE 在技术上的成熟),最近看到的 COM 标准是 0.9 版。请参考其他资料得到能全面的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值