DDE

DDE

動态數據交換
DDE是一種動态數據交換機制(Dynamic Data Exchange,DDE)。使用DDE通訊需要兩個Windows應用程序,其中一個作為服務器處理信息,另外一個作為客戶機從服務器獲得信息。客戶機應用程序向當前所激活的服務器應用程序發送一條消息請求信息,服務器應用程序根據該信息作出應答,從而實現兩個程序之間的數據交換。
  • 中文名:動态數據交換
  • 外文名:Dynamic Data Exchange
  • 定義:
  • 簡稱:DDE
  • 類型:一種動态數據交換機制

基本概念

在Windows、OS/2、以及其他的一些操作系統(帶有第三方的開發工具)上,動态數據交換(Dynamic Data Exchange,DDE)允許數據在程序間被共享或者通信。例如,當你在你的數據庫程序中改變一個表,或者電子制表軟件中的數據項時,則這個表或者數據項也需要在你可能使用的其他軟件中進行相應的改變。DDE是使用共享内存作為公共交換區域并提供應用程序一個協議或者命令集以及消息格式的進程間通信。DDE使用了客戶端/服務器模型,在這個模型中,應用程序對數據的請求在客戶端進行處理,同時應用程序對數據的提供在服務器端處理。

工作原理

DDE的工作原理是:

兩個同時運行的程序間通過DDE方式交換數據時是客戶/伺服器關系,一旦客戶和伺服器建立起來連接關系,則當伺服器中的數據發生變化後就會馬上通知客戶。通過DDE方式建立的數據連接通道是雙向的,即客戶不但能夠讀取伺服器中的數據,而且可以對其進行修改。

DDE和剪貼闆一樣既支持标準數據格式(如文本、點陣圖等),又可以支持自定義的數據格式。但它們的數據傳輸機制卻不同,一個明顯區别是剪貼闆操作幾乎總是用作對用戶指定操作的一次性應答,如從菜單中選擇粘貼命令。盡管DDE也可以由用戶啟動,但它繼續發揮作用,一般不必用戶進一步幹預。例如:全局内存,然後把内存指針postmessage到乙方,乙方根據收到的指針訪問那塊全局内存。有幾個API函數是做這種事的,你在MSDN裡查一下 Dde 打頭的函數全都出來了。因為是已經淘汰的技術,連MFC都沒對他進行封裝。很難保證它同樣會出現在以後的Windows API中。

内容

DDE對話的内容是通過三個标識名來約定的。

    應用程序名:進行DDE對話的雙方的名稱。商業應用程序的名稱在産品文檔中給出。“組态王”運行系統的程序名是“VIEW”;Microsoft Excel的應用程序名是“Excel”;Visual Basic程序使用的是可執行文件的名稱。主題:被讨論的數據域(domain)。對“組态王”來說,主題規定為“tagname”;Excel的主題名是電子表格的名稱,比如sheetl,sheet2,……;Visual Basic程序的主題由窗體(Form)的LinkTopic屬性值指定。項目:這是被讨論的特定數據對象。在“組态王”的數據詞典裡,工程人員定義I/O變量的同時,也定義項目名稱。Excel裡的項目是單元,比如rlc2(rlc2表示第一行、第二列的單元)。對Visual Basic程序而言,項目是一個特定的文本框、标簽或圖片框的名稱

DDE的應用

DDE技術極大地方便了人們的生活與工作。各個區域目前都運用到了APN技術,并在實踐中不斷探索,提高APN技術。例如:DDE技術在污水處理控制系統中的應用。為了進一步實現污水處理控制系統的信息化、智能化,完成現場數據的有效傳輸和設備之間的無縫連接,構建了基于PLC和組态軟件的污水處理控制系統架構,利用動态數據交換(DDE)技術實現現場PLC與VB的數據通信,保證現場數據的實時傳輸。結合倒置A2/O(Anaerobic-Anoxic-Oxic,即厭氧-缺氧-好氧)污水處理工藝流程,設計污水處理自控系統和監控系統,實現對現場設備的控制和生産過程的實時監視。實際結果表明系統運行穩定,具有良好的控制效果。

交換方式

(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較實用。

編寫程序

為了使用方便起見,微軟提供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文件正确的系統路徑。

相關詞條

相關搜索

其它詞條