天天看點

PowerBuilder與外界的互動方式

一.概述

    一般來說,如果系統是一個純粹的C/S模式的MIS應用系統,則與外部程式的互動比較少,PB本身提供的功能就足夠實作所有的功能;但有的時候,當對系統的界面,性能要求比較嚴,或是在系統中還有很多其它的功能時,比如說辦公自動化系統,此時需要比較多的與外界(或是外部程式)通迅,比如要發送EMAIL等等。

    就PowerBuilder來說,它是一個開放式的開發平台,提供了多種手段來擴充它的功能,歸納起來,主要有:

  • WIN API調用
  • DDE(動态資料交換)
  • OLE(動态資料連結)
  • OCX(自定義控件)

下面我們一一介紹各種方法

二.WIN API調用

    在一個系統中,有的功能用PB是實作不了或是不好實作的,比如對資料的壓縮,而在WIN API中卻有相應的函數調用或是我們用其它語言實作起來比較友善,此時我們就要用到API的調用。

    在講解之前,我們來看一下DDL檔案的結構。在DDL中,所有的函數可分為輸出和非輸出兩大類,輸出的函數可以在外部調用,而非輸出的函數則隻能在DDL内部調用(WIN95中也可調用)。一般的,一個DDL包括以下幾個部份:

  • 名為LibEntry的彙編語言子產品
  • 名為LibMain()的非輸出啟動子產品
  • Exported Programmer-Defined DLL函數(輸出函數)
  • 可選的Nonexported Programmer-Defined DLL函數(非輸出函數)

當系統裝載或解除安裝DDL時,都要運作一次LibMain()和WEP()函數。LibMain()執行初始化工作,而WEP()執行所要求的清理工作。

DDL建立的方法有很多種,當然您可直接用WIN API函數和彙編語言編寫,但一般不這樣,象在Visual C++中就提供了建立DLL的功能,還有很多其它方法,在這就不一一說明了。

在建立了DLL後,怎樣才能在PB中通路其中的函數呢?您需要做以下幾步工作:

  • 将DLL檔案拷貝到自已的DOS路徑下或是Windows的路徑下
  • 在調用以前聲明您所要調用的函數:FUNCTION <函數說明> Library <DDL檔案名>
  • 在需要的時候調用

在PB中,對外部函數的聲明有兩種情況,文法如下:

文法一:有傳回值的函數

    { access } FUNCTION returndatatype name ( { { REF } datatype1 arg1,     ..., { REF } datatypen argn } )         LIBRARY "libname"     ALIAS FOR "extname"

文法二:無傳回值的函數

        { access } SUBROUTINE name ( { { REF } datatype1 arg1, ...,    { REF } datatypen argn} )           LIBRARY "libname"     ALIAS FOR "extname"

參數的傳遞:

    通過值傳遞的文法:    ParameterDataType Parameter

    通過引用傳遞的文法:  REF ParameterDataType Parameter

執行個體:

    取得使用者名:

        FUNCTION BOOLEAN GetUserNameA(REF STRING uName,REF ULONG sLength) &

                        LIBRARY "advapi32.DLL"

                STRING UserName,sLength

                sLength = 255

        UserName = SPACE(255) //配置設定空間

                GetUserNameA(UserName,sLength)

        動态觸發鍵盤的鍵值(本例為TAB):

        #DEFINE TABKeyCode  7

        SUBROUTINE Keybd_Event(INT bVk,INT bScan,INT dwFlags,INT dwExtraInfo) &

                        LIBRARY "user32.dll"

                Keybd_Event(TABKeyCode,0,0,0) //按下TAB

                Keybd_Event(TABKeyCode,0,2,0) //放開TAB

三.DDE(動态資料交換)

DDE其實質是一種Windows應用程式之間的交換資料的機制,它是通過其享記憶體來實作的。通常它通過以下方式來實作:

    1.DDE客戶應用程式與DDE伺服器應用程式建立會話

    2.DDE客戶應用程式向DDE伺服器應用程式提出請求

    3.DDE伺服器應用程式向DDE客戶應用程式提供資料和服務

它的工作方式有三種:

    1.冷連接配接:隻有當客戶應用程式請求時,伺服器應用程式才發送資料

    2.溫連接配接:建立了會話後,如果伺服器應用程式的資料更新了,将發送一個消息給客戶應用程式

    3.熱連接配接:如果伺服器應用程式的資料更新了,将自動将資料發送給客戶應用程式

PowerBuilder中的對應事件:

    HotLinkAlarm:        在DDE伺服器應用發送了資料時,應用程式接收到後觸發

    RemoteExec:         當一個DDE客戶發送了一條指令時觸發

    RemoteHotLinkStart:    當DDE客戶開始一個熱連接配接時觸發

    RemoteHotLinkStop:  當DDE客戶結束一個熱連接配接時觸發

    RemoteRequest::      當DDE客戶請求資料時觸發

    RemoteSend:         當DDE客戶已發送了資料時觸發

PowerBuilder中的函數:

    CloseChannel:                    關閉由OpenChannel打開的與DDE伺服器應用的通道

    ExecRemote:                       請求DDE伺服器運作指令

    GetDataDDE:                     從熱連接配接的DDE伺服器應用中得到資料并放到定義好的串中

    GetDataDDEOrigin:            從已建立的熱連接配接中确定資料來源

    GetRemote:                        向伺服器請求資料

    OpenChannel:                     打開一個通道

    RespondRemote:                 通知DDE伺服器應用,所收到的資料是否可接收

    SetRemote:                         請求DDE伺服器應用設定一些特定項

    StartHotLink:                      與DDE伺服器應用建立熱連接配接

    StopHotLink:                      結束與DDE伺服器應用的熱連接配接

    GetCommandDDE:             得到由DDE客戶發送的指令

    GetCommandDDEOrigin:      得到DDE客戶指令的源

     StartDataDDE:                       發送特定資料到DDE客戶應用程式

    StartServerDDE:                     開始啟動伺服器應用

    StopServerDDE:                    停止伺服器應用

實作步驟如下:

    1.建立連接配接

    2.發送請求或是處理請求

    3.發送資料或是接收資料

    4.結束連接配接

四.OLE和OCX(對象連接配接與嵌入)

OLE與OCX的應用主要是源于将多個應用資訊源組合到一起的目标,在PowerBuilder的實際應用中,OCX的應用比較多,因為它能更好的與PowerBuilder的應用程式相結合,進而實作PowerBuilder不好實作或是很難實作的功能。實際上,PowerBuilder本身以及Visual Basic等等其它程式提供了很多處現特定功能的OCX控件。通過它們,我們可以非常容易的實作一些PowerBuilder本身不能實作的功能。

在PowerBuilder中,如果要調用OCX控件的話,首先得将OCX控件在系統中注冊才能使用。在PowerBuilder中使用OCX控件非常的容易,隻需要将OCS控件加入到程式中,然後直接調用其功能即可。其功能請參考各OCX控件的相關資料。 

繼續閱讀