动态数据交换(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, Dynamic Data Exchange)简介相关推荐
- DDE SERVER,DDE CLIENT(动态数据交换) 采用这种技术实现两个程序间数据交换
DDE SERVER,DDE CLIENT(动态数据交换) 采用这种技术实现两个程序间数据交换,工控组态软件里面还在经常使用. 某些时候工控软件读取其它系统的数据或者其他系统要读取工控软件的数据,这种 ...
- 1-occ data exchange (read iges_step)
1-occ data exchange (read iges_step) 平台准备 AIS(Application Interactive Services), 由于occ自带的可视化模块,阅读过其源 ...
- Asp.net Dynamic Data之三改变编辑和操作数据的现实方式
Asp.net Dynamic Data之三改变编辑和操作数据的现实方式 本专题介绍如何运用RouteCollection 添加或是修改Routing URL规则实现对页面的控制. 默认情况下 从Gl ...
- Big Data Exchange宣布在南京建设数据中心
2/17/2020,BDx本周宣布在中国南京修建其最新数据中心,这个数据中心将于2020年6月启用.包括目前已经获得的设施在内,BDx将在两个大洲的一系列城市--包括南京.广州.香港.新加坡和伦敦在内 ...
- [转载]SQL Server 2005 Data Mining简介
简介 企业均在尝试分析其数据时都面临若干问题.通常,并不缺乏数据.事实上,很多企业感觉到他们被数据淹没了:他们没有办法完全利用所有的数据,将其变成信息.为了处理这方面的问题,开发了数据仓库技术, ...
- Azure SQL Database (23) Azure SQL Database Dynamic Data Masking动态数据掩码
<Windows Azure Platform 系列文章目录> 我们在使用关系型数据的时候,有时候希望: - 管理员admin,可以查看到所有的数据 - 普通用户,某些敏感字段,比如信用卡 ...
- Spring Boot 之Spring data JPA简介
文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...
- Dynamic Data Web Application编译是报GetActionPath调用模糊解决办法
新建的Dynamic Data Web Application编译时报错 Error 3 The call is ambiguous between the following methods or ...
- [习题]综合练习 -- SqlDataSource精灵就能完成,[山寨版] Dynamic Data WebSite
这是我的文章备份,有空请到我的网站走走, http://www.dotblogs.com.tw/mis2000lab/ 才能掌握我提供的第一手信息,谢谢您. http://www.dotblogs ...
最新文章
- java float x=26f_东软java笔试题
- CSS中clear属性的both、left和right浅析
- sqlbulkcopy mysql_SqlBulkCopy 的 Timeout 和 BatchSize
- vscode中如何运行git
- 数据库建表需要外键约束?
- 【交换机在江湖】第十二章 VLAN基础篇
- 不同主机之间通过XDMCP协议通信(X-server和X-client不在同一主机)
- Windows系统内置测试工具(winsat)
- 小程序将页面转为图片--Wxml2Canvas
- 仿支付宝实现密码框输入
- MSCI 明晟D.J. Orr博士:中国量化投资不缺人才缺工具
- [附源码]JAVA+ssm计算机毕业设计房屋租赁系统(程序+Lw)
- Datawhale数据分析学习——学术前沿趋势分析 任务1
- 1103:陶陶摘苹果
- twitter_如何找回旧的Twitter网站
- Android 动画实现
- 寒假思雨姐摸底D题题解
- 关于服务器的使用——深度学习菜鸡入门(1)
- 趣链科技李伟:我们高估了区块链五年的价值,也低估了它未来二十年的影响力...
- 加密与解密(第四版)第5章演示版保护技术
热门文章
- 汕头金山中学2021高考成绩查询,2019汕头市金山中学录取分数线及2019高考成绩喜报...
- 大红灯笼高高挂专业影评_浅谈《大红灯笼高高挂》
- 详解 Mysql LEFT JOIN和JOIN查询区别及原理
- 总结:Apache架构师30条架构原则
- GOROOT、GOPATH
- Swift的Guard语句
- UIView常用的一些方法小记之setNeedsDisplay和setNeedsLayout
- pandas最大的时间间隔_pandas生成时间列表(某段连续时间或者固定间隔时间段)(示例代码)...
- spark on yarn 完全分布式_Spark编程笔记(1)-架构基础与运行原理
- java中原生方法_java中原生(native)函数的用法