关于动态数据交换Windows 为应用程序间的数据交换提供了多种方式,动态数据交换协议就是其中一种使用项。
动态数据交换协议是一整套信息和指引方针,在需要分享数据和使用共享存储来交换数据的应用程序间发送信息。
应用程序可使用该协议作为一次性数据传输或者应用间发送更新使其成为新的可用数据的持续交换。
Windows还支持动态数据交换管理库(DDEML)。
DDEML是应用程序可用于共享数据的动态链接库(DLL)。
DDEML 提供的功能和消息简化了向应用程序添加DDE功能的任务。
应用程序不是直接发送,发布和处理DDE消息,而是使用DDEML函数来管理DDE对话。
(DDE对话是客户端和服务器应用程序之间的交互。
)DDEML还提供了一个管理DDE应用程序共享的字符串和数据的工具。
DDE应用程序不是使用原子和共享内存对象的指针,而是创建和交换标识字符串的字符串句柄和标识内存对象的数据句柄来标识存储对象。
DDEML还使服务器应用程序能够注册它所支持的服务名称。
这些名称被广播给系统中的其他应用程序,这些应用程序可以使用名称连接到服务器。
此外,DDEML通过强制DDE协议以一致的方式实现DDE协议来确保DDE应用程序之间的兼容性。
使用基于消息的DDE协议的现有应用程序与使用DDEML的应用程序完全兼容。
也就是说,使用基于消息的DDE的应用程序可以与使用DDEML的应用程序建立对话并执行事务。
由于DDEML的许多优点,新应用程序应该使用它而不是DDE消息。
要使用DDEML的API元素,必须在源文件中包含DDEML头文件,与DDEML库链接,并确保DDEML动态链接库位于系统的搜索路径中。
本节讨论以下主题。
动态数据交换协议由于Windows具有基于消息的体系结构,传递消息是在应用程序之间自动传输信息的最合适的方法。
但是,消息只包含用于传递数据的两个参数(wParam和lParam)。
因此,当应用程序之间传递的信息超过几个字时,这些参数必须间接引用其他数据。
DDE协议确切定义了应用程序应该如何使用wParam和lParam参数通过全局原子和共享内存句柄来传递更大的数据。
DDE协议具有分配和删除全局原子和共享内存对象的特定规则。
全局原子是对字符串的引用。
在DDE协议中,原子标识交换数据的应用程序,交换数据的性质以及数据项本身。
有关原子的更多信息,请参阅关于About Atoms。
用于WINDOWS动态数据交换DDE最适合于不需要持续用户交互的数据交换。
通常,应用程序为用户提供了一种方法来建立交换数据的应用程序之间的链接。
一旦建立了链接,应用程序就可以在没有用户参与的情况下交换数据。
DDE可用于实现广泛的应用程序功能- 例如:链接到实时数据,如股市更新,科学仪器或过程控制。
创建复合文档,如包含由图形应用程序生成的图表的文字处理文档。
使用DDE时,图表将在源数据更改时更改,而文档的其余部分保持不变。
在应用程序之间执行数据查询,例如电子表格查询数据库以查找过期的帐户。
从使用者的角度看动态数据交换∙下面的例子从用户的角度说明了两个DDE应用程序如何协作。
电子表格用户希望使用Microsoft Excel来跟踪纽约证券交易所特定股票的价格。
用户有一个称为Quote的应用程序,可以访问纽约证券交易所数据。
Excel和报价之间的DDE对话发生如下:∙用户通过提供将提供数据和感兴趣的特定主题(NYSE)的应用程序名称(报价)来启动对话。
由此产生的DDE 对话用于请求特定股票的报价。
∙ Excel将应用程序和主题名称广播到当前在系统中运行的所有DDE应用程序。
引用回复,与Excel建立关于纽约证券交易所主题的对话。
∙ 然后,用户可以在单元格中创建电子表格公式,请求在特定股票报价更改时自动更新电子表格。
例如,用户可以通过指定以下Excel公式,在ZAXX股票的卖出价格发生变化时请求自动更新:='Quote'|'NYSE'!ZAXX∙ 用户可以随时终止ZAXX股票报价的自动更新。
其他数据链接(如其他股票的报价)单独建立,在纽约证券交易所的同一次谈话中仍然保持活跃。
∙ 用户也可以终止纽约证券交易所主题的Excel和报价之间的整个对话,以便在没有发起新对话的情况下,不能建立该主题的特定数据链接。
动态数据交换概念以下部分所解释的重要概念和术语是理解动态数据交换的要点客户体、服务器和对话据说参与DDE的两个应用程序正在进行DDE对话。
启动对话的应用程序是DDE客户端应用程序;响应客户端的应用程序是DDE服务器应用程序。
一个应用程序可以同时进行多个对话,在一些应用程序中作为客户端,在其他服务器中作为服务器。
DDE对话发生在两个窗口之间,每个参与的应用程序之一。
窗口可能是应用程序的主窗口;如在多文档界面(MDI)应用程序中的与特定文档相关联的窗口;或者一个隐藏的(不可见的)窗口,其唯一目的是处理DDE消息。
由于DDE对话由参与对话的窗口的一对句柄识别,所以不应该有窗口参与与另一个窗口的多个对话。
客户端应用程序或服务器应用程序必须为特定服务器或客户端应用程序的每个对话提供不同的窗口。
应用程序可以通过为每个对话创建一个隐藏窗口来确保一对客户端和服务器窗口从不参与多个对话。
这个窗口的唯一目的是处理DDE消息。
应用程序、话题和项目名称DDE协议使用应用程序,主题和项目名称的三级层次结构来标识在客户端和服务器之间传递的数据单元。
每个DDE对话由应用程序名称和主题唯一地定义。
在DDE对话开始时,客户端和服务器确定应用程序名称和主题。
应用程序名称通常是服务器应用程序的名称。
例如,当Excel在对话中充当服务器时,应用程序名称是Excel。
DDE主题是对话期间可以“讨论”(交换)多个数据项的数据的一般分类。
对于在基于文件的文档上运行的应用程序,主题通常是文件名。
对于其他应用程序,该主题是特定于应用程序的名称。
由于客户端和服务器窗口句柄一起标识DDE对话,因此定义对话的应用程序名称和主题在对话过程中无法更改。
DDE数据项是与在应用程序之间交换的对话主题有关的信息。
数据项的值可以从服务器传递到客户端,也可以从客户端传递到服务器。
数据可以通过任何标准剪贴板格式或注册剪贴板格式传递。
名为Link的特殊注册格式标识DDE对话中的项目。
获取更多关于剪贴板的信息,查阅Clipboard.系统主题应用程序应始终支持系统主题。
本主题提供了可能对其他应用程序普遍感兴趣的信息的上下文。
数据项值必须以CF_TEXT剪贴板格式呈现。
系统主题的项目值的单个元素必须由制表符分隔。
下表建议了系统主题的一些项目。
永久数据链接一旦DDE对话开始,客户端就可以与服务器建立一个或多个永久的数据链接。
数据链接是一种通信机制,只要指定数据项的值发生变化,服务器就会通过该机制通知客户端。
数据链接是永久的,这个通知过程一直持续到数据链接或DDE 对话本身终止。
有两种永久的DDE数据链接:热和热。
在温暖的数据链接中,服务器通知客户端数据项的值已经改变,但服务器不会将数据值发送给客户端,直到客户端请求为止。
在热数据链接中,服务器立即将更改的数据值发送给客户端。
支持热数据链接或热数据链接的应用程序通常会在“编辑”菜单中提供“复制”或“粘贴链接”命令,以使用户能够在应用程序之间建立链接原子和共享存储对象DDE消息的某些参数是全局原子或共享内存对象。
使用这些参数的应用程序必须遵循有关何时分配和删除的明确规则。
在任何情况下,消息发送者都必须删除由于错误情况(如PostMessage函数失败)而导致接收方不会收到的任何原子或共享内存对象。
DDE使用共享内存对象有三个目的:要传送要交换的数据项值。
这是WM_DDE_DATA和WM_DDE_POKE消息中的hData参数所引用的项目。
在消息中携带选项。
这是WM_DDE_ADVISE消息中的hOptions参数引用的项目。
要执行命令执行字符串。
这是WM_DDE_EXECUTE消息中的hCommands参数所引用的项目及其对应的WM_DDE_ACK 消息。
接收DDE共享内存对象的应用程序必须将其视为只读。
应用程序不得将该对象用作自由交换数据的相互读写区域。
和DDE原子一样,应用程序应该释放一个共享内存对象来有效地管理内存。
应用程序还应该锁定和解锁内存对象。
动态数据交换信息综述由于DDE是基于消息的协议,因此它不使用函数或库。
所有的DDE事务都是通过在客户端和服务器窗口之间传递某些定义的DDE消息来进行的。
有九个DDE消息; 这些消息的符号常量在DDE头文件中定义。
在这个头文件中也定义了各种DDE消息的某些结构。
下表总结了DDE消息。
应用程序调用SendMessage来发出WM_DDE_INITIATE消息或WM_DDE_ACK消息,以响应WM_DDE_INITIATE。
所有其他消息由PostMessage发送。
这些调用的第一个参数是接收窗口的句柄; 第二个参数包含要发送的消息; 第三个参数标识发送窗口; 第四个参数包含消息特定的参数。
动态数据交换消息流一个典型的DDE对话包含下述事件:1. 客户端应用程序启动对话,服务器应用程序响应。
2. 应用程序通过以下任何或所有方法交换数据:服务器应用程序根据客户的请求向客户端发送数据。
客户端应用程序将未经请求的数据发送到服务器应用程序。
客户端应用程序请求服务器应用程序在数据项发生变化(暖数据链接)时通知客户端。
客户端应用程序请求服务器应用程序在数据更改时发送数据(热数据链接)。
服务器应用程序根据客户的请求执行命令。
3. 客户端或服务器应用程序终止对话。
处理来自客户端或服务器的请求的应用程序窗口必须严格按照它们接收的顺序进行处理。
客户可以建立与多个服务器的对话;服务器可以与多个客户端进行对话。
处理来自多个源的消息时,客户端或服务器必须同步处理对话的消息,但不需要同步处理所有消息。
换句话说,它可以根据需要从一个对话转移到另一个对话。
如果应用程序无法处理传入的请求,因为它正在等待DDE响应,则必须通过发布WM_DDE_ACK消息并将DDEACK结构的fBusy成员设置为1来防止死锁。
如果应用程序还可以发送繁忙的WM_DDE_ACK消息由于任何原因,它不能在合理的时间内处理收到的请求。
应用程序应该能够处理客户端或服务器在一定时间内对消息作出响应的失败。
由于超时间隔可能因应用程序的性质和用户系统的配置(包括是否连接到网络)而异,因此应用程序应为用户指定间隔提供一种方法。
参数打包功能许多DDE消息的lParam参数包含两个数据。
例如,WM_DDE_DATA消息的lParam包含一个数据句柄和一个原子。
应用程序必须使用PackDDElParam函数将句柄和原子打包到lParam参数中,并使用UnpackDDElParam函数删除这些值。