一 引言
Windows支持三种基本的IPC(进程间通信)机制动态链接库(DLL)中的共享数据段Windows剪贴版(CliPBoard)和动态数据交换DDE(Dynamic Data Exchange)许多着名的Windows应用程序如Microsoft Word等都宣布支持DDE技术并在程序中嵌入了DDE消息处理函数而此类应用程序单在DDE技术上讲大多是作为一个DDE服务器形式存在的这就允许用户通过自行编制的一些外围软件以DDE客户的身份对其进行连接并通过向DDE服务器程序发送一些特定的宏命令来完成对服务器程序的动态控制本文就以常用的Microsoft Word为例讲述了在Delphi 编程环境下如何编制DDE客户程序使其动态控制Microsoft Word的一般方法
二 DDE的工作原理
DDE顾名思义是提供对不同程序在运行期间实现对数据的动态交换的一种通用技术Windows消息虽然是在不同程序窗口间传送信息的最佳手段但一条消息只能包含两个参数(wParam和lParam)不能传送较多的信息内存块是存放较多信息的重要手段但不支持全局内存句柄的共享DDE正是建立在Windows内部消息系统全局原子和共享全局内存基础上的一种协议用来协调Windows应用程序之间的数据交换和命令调用
DDE协议使用三级命名服务(service)主题(topic)和数据项(item)来标识DDE所传递的数据单元服务使应用程序具有了提供给其他程序的数据交换能力一般服务就是应用程序的文件名如Word的服务就是是Winword(可执行文件是Winwordexe)主题是对服务器有意义的信息单元对于Word文档就是很好的主题许多服务器都有默认的主题System但无法知道服务器确切有那些主题除非查阅应用程序的相关技术文档每次DDE客户与服务程序之间的对话都是先由客户启动的所以在每次客户启动之前DDE服务器必须先投入运行下面是一个典型的DDE会话流程的事务组成
·客户程序自动会话服务器程序响应
·客户和服务器用下述方法交换数据
·服务器应客户的请求向客户发送数据
·客户主动想服务器发送数据
·客户要求服务器在数据修改时发送数据(热数据连接)
·客户要求服务器在数据修改后发送通知(温数据连接)
·在客户的要求下服务器执行一个命令
·由客户或服务器中止会话
三 设计思路
首先在开发工具的选择上选择了提供有现成的DDE 系列组件的 Borland Delphi 既然以Microsoft Word作为要连接的服务器在与其建立连接之前要先设定好连接的服务与主题由于本例只要求通过本程序控制Word的一些操作动作如打开新文件关闭文件插入表格等等所以可以分别设定这两项为Winword和System当设置好连接后就可以通过Delphi提供的DDEClientConv组件的OpenLink函数打开与这个服务的连接剩下的工作就是向Word服务器发送宏命令并通过组件向其发送执行宏的命令即可用该组件的函数ExecuteMacro来实现之
四程序的实现
(一) 加入DDE客户端组件
新建一App工程WordDDE然后在Component Palette组件条的System属性页里选择DdeClientConv组件并把它拖放到窗体上修改其Name 属性为DDEClient
(二) 添加同DDE服务进行交互的代码
在工程上添加一个过程RunMacro用于打开同Word服务器的链接并通知服务器执行由Macro标识的宏命令让Word按用户的意图完成响应的动作完成之后由客户方断开这次连接完成一次会话下面是上述过程的实现代码
procedure TForm
RunMacro(Macro:pChar);
var pMacro:array[] of Char;
begin
DDEClientSetLink(WinwordSystem);{设置连接}
DDEClientOpenLink;{按设置打开连接}
StrPCopy(pMacroMacro);
if Not DDEClientExecuteMacro(pMacrofalse) then{执行宏命令}
ShowMessage(Unable to Execute Macro);
DDEClientCloseLink;{断开连接}
end;
(三) 宏命令的执行
宏(Macro)是客户程序要服务器完成的一些操作指令对与特定的Microsoft Word 而言无非是些打开文件插入分割符复制粘贴字符等一些字处理方面的宏命令这些宏命令完成的功能大多在Word的菜单下都能找到与之相匹配的菜单如关闭文件菜单完成的功能就可以通过宏[FileClose]来完成可以向窗口添加一个按钮或是菜单然后在其处理函数中添加执行宏的代码如下
procedure TForm
N
Click(Sender: TObject);
begin
RunMacro([FileNew]);{让Word创建一个新文件宏[FileNew]由函数RunMacro通知Word}
end;
Word下有许多可供传送执行的宏命令现将一些常用的宏罗列如下以备实际编程时选用
[FileNew] …… 创建新文件
[FileClose] …… 关闭文件
[FileSave] …… 保存文件
[FilePrint] …… 打印文件
[FileExit] …… 退出Word
[File] …… 打开最近打开的文件相应还有[File][File]等等
[EditCut] …… 剪切操作
[EditCopy] …… 复制操作
[EditPaste] …… 粘贴操作
[EditUndo] …… 恢复上一步
[EditRedo] …… 重做上一步
[EditClear] …… 清除操作
[EditSelectAll] …… 全选操作
[ViewNormal] …… 正常视图
[ViewPage] …… 页面视图
[ViewOutLine] …… 大纲视图
[InsertBreak] …… 插入分割符
[InsertIndex] …… 插入索引
[FormatNumber] …… 格式化项目符号和编号
[ToolsOptions] …… 工具的选项
[TableInsertTable] …… 插入表格
[TableInsertRow] …… 插入行
[TableDeleteRow] …… 删除行
[TableSplit] …… 拆分表格
[TableSelectRow] …… 选择行
[TableSelectColumn] …… 选择列
[TableSelectTable] …… 选择表格
[TableSort] …… 排序
[WindowNewWindow] …… 新建窗口
[Window] …… 最近打开的窗口响应还有[Window][Window]等等
[HelpIndex] …… 帮助的索引
[HelpAbout] …… 帮助的关于
小结
DDE技术向用户提供了一种更加集成的工作环境最适合于不需要用户参与的动态数据交换通过上述这个例子对DDE 的工作原理和编程思想有了一定的认识之后可以用类似的方法实现同其他程序如Microsoft Execl的DDE动态交互