利用DDE進(jìn)行動態(tài)數(shù)據(jù)交換

字號:

在數(shù)據(jù)庫應(yīng)用程序中,經(jīng)常需要與外部的數(shù)據(jù)源進(jìn)行數(shù)據(jù)交換。通常我們會考慮利用開放式數(shù)據(jù)庫互連標(biāo)準(zhǔn)ODBC。ODBC由驅(qū)動程序管理器和一系列把SQL作為它們訪問語言的驅(qū)動程序所組成。當(dāng)需要時(shí),ODBC驅(qū)動程序翻譯各種產(chǎn)品的SQL語言以使不同產(chǎn)品間的連接完美無缺,從而使得連接另外一個(gè)應(yīng)用程序上的數(shù)據(jù)成為可能,甚至可以在Visual FoxPro并不直接支持的格式(例如電子表格)中提取和修改數(shù)據(jù)。鑒于ODBC早已經(jīng)被很多程序員所熟知,我們這里僅僅討論一種不太常用的方法:DDE。
    ----DDE是一種動態(tài)數(shù)據(jù)交換機(jī)制(Dynamic Data Exchange,DDE)。使用DDE通訊需要兩個(gè)Windows應(yīng)用程序,其中一個(gè)作為服務(wù)器處理信息,另外一個(gè)作為客戶機(jī)從服務(wù)器獲得信息??蛻魴C(jī)應(yīng)用程序向當(dāng)前所激活的服務(wù)器應(yīng)用程序發(fā)送一條消息請求信息,服務(wù)器應(yīng)用程序根據(jù)該信息作出應(yīng)答,從而實(shí)現(xiàn)兩個(gè)程序之間的數(shù)據(jù)交換。在Visual FoxPro中,一共十一個(gè)常用的DDE函數(shù),它們是:
    DDEAbortTrans() 刪除異步的DDE處理
    DDEAdvise() 建立與服務(wù)器應(yīng)用程序的溫或熱連接
    DDEEnabled() 設(shè)置或返回DDE狀態(tài)
    DDEExecute() 向服務(wù)器應(yīng)用程序發(fā)送一條執(zhí)行消息
    DDEInitiate() 打開到服務(wù)器應(yīng)用程序的DDE控制板
    DDELastError() 返回DDE函數(shù)引起的最后一條錯(cuò)誤信息
    DDEPoke() 傳送數(shù)據(jù)庫到客戶機(jī)或服務(wù)器應(yīng)用程序
    DDERequest() 服務(wù)器應(yīng)用程序請求數(shù)據(jù)
    DDESetOption() 修改或返回DDE設(shè)置
    DDESetService() 添加、刪除、修改服務(wù)名的狀態(tài)
    DDESetTopic() 連接服務(wù)名與標(biāo)題名
    DDETerminte() 關(guān)閉DDE控制板
    ----Visual FoxPro既可以作為DDE客戶機(jī),也可以作為DDE服務(wù)器。當(dāng)Visual FoxPro作為客戶機(jī)時(shí),一個(gè)典型的請求從其他應(yīng)用程序輸入數(shù)據(jù)的FoxPro程序由包含以下步驟的代碼組成:
    調(diào)用DDEInitiate()函數(shù)建立與服務(wù)器應(yīng)用程序的連接。
    如果成功地建立了連接關(guān)系,調(diào)用DDERequest()函數(shù)請求從服務(wù)器應(yīng)用程序輸入信息。可以重復(fù)調(diào)用DDERequest()函數(shù)請求輸入其他的信息。
    完成對數(shù)據(jù)的請求后,調(diào)用DDETerminate()函數(shù)技術(shù)與服務(wù)器應(yīng)用程序的連接關(guān)系。只有這樣做才能夠釋放系統(tǒng)資源。
    當(dāng)Visual FoxPro作為服務(wù)器時(shí),一個(gè)典型的響應(yīng)其他應(yīng)用程序請求數(shù)據(jù)的FoxPro程序由包含以下步驟的代碼組成:
    調(diào)用DDESetService()函數(shù)生成服務(wù)過程(建立服務(wù)過程名)并且指定服務(wù)過程的類型。
    調(diào)用DDESetTopic()函數(shù)生成服務(wù)標(biāo)題并且指定客戶機(jī)請求中設(shè)定標(biāo)題時(shí)的運(yùn)行過程。
    生成DDESetTopic()中指定的過程用以接受傳遞給過程的參量??蛻魴C(jī)請求信息調(diào)用此過程,此過程執(zhí)行請求操作并且向客戶機(jī)應(yīng)用程序返回所請求的信息。
    ----應(yīng)用程序之間的DDE會話可以使用冷連接、溫連接和熱連接。當(dāng)Visual FoxPro做為客戶機(jī)時(shí),所建立的連接為冷連接;當(dāng)Visual FoxPro做為服務(wù)器時(shí),可以使用其中任意的一種連接方式??梢允褂肈DEAdvise()函數(shù)來初始化DDE溫連接和熱連接的會話。傳遞給DDEAdvise()函數(shù)的參數(shù)之一是一個(gè)用戶自定義函數(shù)的名稱,服務(wù)器應(yīng)用程序調(diào)用該函數(shù)通知客戶機(jī)數(shù)據(jù)已經(jīng)改動。因此,在溫連接和熱連接會話中,當(dāng)數(shù)據(jù)源有所改動時(shí),客戶機(jī)能夠根據(jù)服務(wù)器的通知自動進(jìn)行數(shù)據(jù)更新。
    ----以下是一個(gè)利用DDE與Word進(jìn)行數(shù)據(jù)交換的示例程序。該程序打開一個(gè)DOC文件,將其全部內(nèi)容拷貝到剪貼板上,然后關(guān)閉文件并退出Word。
    * 啟動應(yīng)用程序Word
    RUN /N1 D:\WORD\WINWORD.EXE
    * 建立DDE連接
    Channel=DDEInitiate(“WinWord”,”System”)
    * 判斷連接是否已經(jīng)建立
    IF Channel<>-1
    * 將Word應(yīng)用程序化
    =DDEExecute(Channel,”[AppMaximize]”)
    * 打開文件d:\word\test.doc
    =DDEExecute(Channel,’[FileOpen “d:\word\test.doc”]’)
    * 選取所有內(nèi)容