複製鏈接
請複製以下鏈接發送給好友

動態數據交換

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

動態數據交換簡介

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

動態數據交換工作原理

DDE的工作原理是:
兩個同時運行的程序間通過DDE方式交換數據時是客户/伺服器關係,一旦客户和伺服器建立起來連接關係,則當伺服器中的數據發生變化後就會馬上通知客户。通過DDE方式建立的數據連接通道是雙向的,即客户不但能夠讀取伺服器中的數據,而且可以對其進行修改。
DDE和剪貼板一樣既支持標準數據格式(如文本、點陣圖等),又可以支持自定義的數據格式。但它們的數據傳輸機制卻不同,一個明顯區別是剪貼板操作幾乎總是用作對用户指定操作的一次性應答,如從菜單中選擇粘貼命令。儘管DDE也可以由用户啓動,但它繼續發揮作用,一般不必用户進一步干預。
例如:
甲方申請一塊全局內存,然後把內存指針postmessage到乙方,乙方根據收到的指針訪問那塊全局內存。有幾個API函數是做這種事的,你在MSDN裏查一下 Dde 打頭的函數全都出來了。因為是已經淘汰的技術,連MFC都沒對他進行封裝。很難保證它同樣會出現在以後的Windows API中 [2] 

動態數據交換內容

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

動態數據交換交換方式

(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文件正確的系統路徑。
參考資料