一、 引言
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(可執行文件是Winword.exe);主題是對服務器有意義的信息單元,對於Word文檔就是很好的主題,許多服務器都有默認的主題System,但無法知道服務器確切有那些主題,除非查閱應用程序的相關技術文檔。每次DDE客戶與服務程序之間的對話都是先由客戶啟動的,所以在每次客戶啟動之前,DDE服務器必須先投入運行,下面是一個典型的DDE會話流程的事務組成:
·客戶程序自動會話,服務器程序響應。
·客戶和服務器用下述方法交換數據:
·服務器應客戶的請求向客戶發送數據;
·客戶主動想服務器發送數據;
·客戶要求服務器在數據修改時發送數據(熱數據連接);
·客戶要求服務器在數據修改後發送通知(溫數據連接);
·在客戶的要求下,服務器執行一個命令。
·由客戶或服務器中止會話。
三、 設計思路
首先,在開發工具的選擇上,選擇了提供有現成的DDE 系列組件的 Borland Delphi 5.0。既然以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 TForm1.RunMacro(Macro:pChar);
var pMacro:array[0..80] of Char;
begin
DDEClient.SetLink('Winword','System');{設置連接}
DDEClient.OpenLink;{按設置打開連接}
StrPCopy(pMacro,Macro);
if Not DDEClient.ExecuteMacro(pMacro,false) then{執行宏命令}
ShowMessage('Unable to Execute Macro');
DDEClient.CloseLink;{斷開連接}
end;
(三) 宏命令的執行
宏(Macro)是客戶程序要服務器完成的一些操作指令,對與特定的Microsoft Word 而言無非是些打開文件、插入分割符、復制粘貼字符等一些字處理方面的宏命令,這些宏命令完成的功能大多在Word的菜單下都能找到與之相匹配的菜單。如"關閉文件"菜單完成的功能就可以通過宏[FileClose]來完成。可以向窗口添加一個按鈕或是菜單然後在其處理函數中添加執行宏的代碼如下:
procedure TForm1.N2Click(Sender: TObject);
begin
RunMacro('[FileNew]');{讓Word創建一個新文件,宏[FileNew]由函數RunMacro通知Word}
end;
Word下有許多可供傳送執行的宏命令,現將一些常用的宏羅列如下,以備實際編程時選用:
[FileNew] …… 創建新文件
[FileClose] …… 關閉文件
[FileSave] …… 保存文件
[FilePrint] …… 打印文件
[FileExit] …… 退出Word
[File1] …… 打開最近打開的文件,相應還有[File2]、[File3]等等
[EditCut] …… 剪切操作
[EditCopy] …… 復制操作
[EditPaste] …… 粘貼操作
[EditUndo] …… 恢復上一步
[EditRedo] …… 重做上一步
[EditClear] …… 清除操作
[EditSelectAll] …… 全選操作
[ViewNormal] …… 正常視圖
[ViewPage] …… 頁面視圖
[ViewOutLine] …… 大綱視圖
[InsertBreak] …… 插入分割符
[InsertIndex] …… 插入索引
[FormatNumber] …… 格式化項目符號和編號
[ToolsOptions] …… 工具的選項
[TableInsertTable] …… 插入表格
[TableInsertRow] …… 插入行
[TableDeleteRow] …… 刪除行
[TableSplit] …… 拆分表格
[TableSelectRow] …… 選擇行
[TableSelectColumn] …… 選擇列
[TableSelectTable] …… 選擇表格
[TableSort] …… 排序
[WindowNewWindow] …… 新建窗口
[Window1] …… 最近打開的窗口,響應還有[Window2]、[Window3]等等
[HelpIndex] …… 幫助的索引
[HelpAbout] …… 幫助的關於
小結
DDE技術向用戶提供了一種更加集成的工作環境,最適合於不需要用戶參與的動態數據交換。通過上述這個例子,對DDE 的工作原理和編程思想有了一定的認識之後,可以用類似的方法實現同其他程序如Microsoft Execl的DDE動態交互。