一.概述
一般來說,如果系統是一個純粹的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控件的相關資料。