PB8.0應用程序編譯發佈技術研究


執行文件的建立

  1、編譯格式的選擇

  PowerBuilder 8.0對生成可執行文件提供了兩種編譯格式:僞代碼(Pcode,即pseudocode的縮寫)和機器代碼(Machinecode)。僞代碼是一種在所有PowerBuilder 平臺上支持的解釋性語言,它的格式與PowerBuilder 運行庫(.pbl)一樣,在可執行狀態下保存單個對象,其優點是方便和可移植;機器代碼則是真正的完全脫離PowerBuilder 環境的可執行文件,其優點是速度快,但文件容量比較大。選擇編譯代碼格式一般基於以下三個方面:

  ①速度。若目標是優化運行速度和應用強化腳本處理,則選擇機器代碼。要是代碼中較多地使用了循環結構、浮點運算或整數算法及函數調用,機器代碼將比僞代碼做得更好。但僞代碼的編譯速度比機器代碼快,特別是開發人員要快速地創建測試用的可執行文件時非常便利;

  ②大小。僞代碼生成的文件比機器代碼的小。如運行應用程序的終端機器容量緊張的話,就需要放棄較快的機器代碼而選擇僞代碼;

  ③移植。僞代碼對於跨平臺的應用非常有用。它可以方便地跨平臺(PowerBuilder 支持)使用,包括:Microsoft Windows (16位和32位)、AppleMacintosh和UNIX。機器代碼是依賴於平臺的,也就是說要求生成和可執行應用平臺一致,不過它可以獲得更好的性能。

  2、動態庫的建立

  發佈PowerBuilder 8.0應用可以將一些對象不放到可執行文件中,而放到動態庫中在運行時裝入,這樣可以將應用程序分割成更小的模塊便於管理和維護。

  選擇僞代碼(Pcode)編譯方式生成PowerBuilder動態庫(.pbd文件),選擇機器代碼(Machinecode)方式在Windows和UNIX平臺上生成動態鏈接庫(.dll文件,如將test.pbl編譯成test.dll),在machine平臺上生成平臺支持的共享庫(如test.lib)。如果在Windows上有兩個應用,那麼編譯成的.pbd包含一個調用全局外部函數的用戶對象,爲了保證正確調用函數必須爲每個應用單獨編譯和發佈.pbd文件。

  當建立動態庫時,將源庫(.pbl文件)中所有對象的編譯版本拷貝到動態庫中。爲了在某些庫中只使用所需的對象,可以將它們放到一個標準的PowerBuilder庫(.pbl)中。

  在建立動態庫時,PowerBuilder並不檢查所有對象,只是簡單地去掉對象的源格式,因此,對於一些在畫筆或腳本中指定了使用資源(圖形、圖標或指針)的對象,若不想提供單獨的資源,則必須在資源文件(.pbr)中羅列出這些資源,這樣才能保證在建立動態庫時包含這些資源。

  動態庫的建立有兩種途徑:一是在庫管理畫筆中建立;二是在工程畫筆中建立工程對象時一起建立。

  3、資源文件的使用

  可執行文件或動態庫中可以包含一些資源(圖形、圖標或指針),也可以將它們作爲單獨的資源文件(.pbr文件)保存。

  (1)單獨的分佈資源

  若某資源不包含在可執行文件或動態庫中,則在執行應用程序引用它時,PowerBuilder按查詢路徑查找該資源,因此,必須將它與應用程序一起放在查詢路徑下。

  Windows的查詢路徑爲:當前目錄,Windows目錄,Windows的System目錄和PATH環境變量中設置的所有目錄。

  (2)資源文件

  可以使用PowerBuilder資源文件(.pbr)替代單獨的資源,其中列出所有的動態分配的資源也可以包含動態分配的數據窗口對象。PowerBuilder將這些資源編譯後放入可執行文件或.pbd文件中,這些資源在執行時可直接使用。

  若給數據窗口控件動態分配數據窗口對象,則必須創建一個資源文件,且在可執行文件或動態庫文件中包含該對象,或在一個單獨的動態庫中包含它。

  資源文件(.pbr)是一個ASCII碼文件,在其中列出了應用程序要有到的各種資源(如.bmp、.cur、.ico、.rle和.wmf文件)和數據窗口對象。使用文本編輯器(如Windows的記事本)創建一個文本文件,其中列出在應用中動態引用的資源文件,一行列出一個資源,格式如:

appico.ico
appbmp1.bmp
appbmp2.bmp
……

  以上文件和對象都假設是在當前目錄中,如果存在於另一個目錄中,則必須包含所在路徑,格式如:

e:\myapp\test.jpg。

  在.pbr文件中指定的文件名必須與在腳本中引用的資源匹配,若引用時包含路徑,則在.pbr文件中也必須包含同一路徑,否則因PowerBuilder在執行時只是簡單地進行字符串比較而導致無法發現該資源。

  若應用程序中包含有動態引用的數據窗口,則在.pbr文件中必須包含數據窗口對象,格式如:

myapp.pbl(dw_infodisplay)

  其中:myapp.pbl爲應用程序庫,dw_infodisplay爲數據窗口對象,一般是在當前目錄或指定路徑。在執行時,若引用資源,PowerBuilder首先檢查可執行文件,找不到再在.pbd文件中、文件查詢路徑的目錄中查找。

  在工程畫筆中建立工程對象時可以爲可執行文件或每一個動態庫指定它使用的資源文件,也可以在庫管理畫筆中建立動態庫時使用。

配置PowerBuilder 8.0應用程序

  一般來說發佈一個PowerBuilder 8.0應用程序,除提交應用程序可執行文件(.exe)、應用程序的動態庫(.pbd或.dll)外,還應包含如下文件:

  1、PowerBuilder 8.0應用程序運行時的支持文件

  PowerBuilder 8.0應用程序運行時的支持文件(.dll)應放在與應用程序相同的目錄中或放在搜索路徑中的目錄中。

  以上文件可以在C:\Program Files\Sybase\Shared\PowerBuilder取得。

  2、數據庫接口

  所有數據庫接口文件及驅動程序(PBTRA80.DLL、PBODB80.DLL和PBODB80.INI)必須放在應用程序目錄或系統目錄中。

  以上文件可以在C:\Program Files\Sybase\Shared\PowerBuilder取得。我們把他們複製到應用程序目錄或系統目錄中。如果使用專用數據庫接口以及activeX,所需複製的文件參考PowerBuilder的OnlineBook。

  3、Microsoft ODBC驅動程序和DLLs

  DS16GT.DLL,DS32GT.DLL,ODBC32.DLL,ODBC32GT.DLL,ODBCAD32.EXE,ODBCCP32.CPL,_
  ODBCCP32.DLL,ODBCCR32.DLL,ODBCINST.CNT,ODBCINST.HLP,ODBCINT.DLL,ODBCTRAC.DLL

  以上文件可以在Window的系統目錄system32取得,具體路徑隨操作系統不同而不同。我們把他們複製到應用程序目錄或系統目錄中。

  4、Adaptive Server Anywhere的ODBC數據庫驅動程序及其支持文件
PBBAS15.dll,PBFLT15.dll, PBUTL15.dll,PBTRN15.dll,IVPB.LIC,PBDRV15.CNT,PBDRV15.HLP。

  以上文件可以在C:\Program Files\Sybase\Shared\MerantODBC取得,我們把他們複製到應用程序目錄或系統目錄中。

  5、Adaptive Server Anywhere運行系統文件

DBODBC7.DLL,DBBACKUP.EXE,DBCON7.DLL,DBISQLC.EXE,DBLGEN7.DLL,DBLIB7.DLL,DBODTR7.DLL,_
DBTOOL7.DLL,DBUNLOAD.EXE,DBVALID.EXE,DBENG7.EXE,DBCTRS7.DLL,DBSERV7.DLL,DBWTSP7.DLL。

  以上文件可以在C:\Program Files\Sybase\SQL Anywhere 7\win32取得,我們把他們複製到應用程序目錄或系統目錄中。

  6、OLE系統文件

  如果應用程序中使用了OLE控件,那麼終端用戶的機器上應該有OLE系統文件,它們是:
COMPOBJ.DLL,OLE2NLS.DLL,CTL3DV2.DLL,OLE2PROX.DLL,OLE2.DLL,STORAGE.DLL,OLE2CONV.DLL,_
TYPELIB.DLL,OLE2DISP.DLL,TDOLE.TLB

  若它們不存在的話,我們把他們複製到應用程序目錄或系統目錄中。

  以上所列的所有支持文件不一定全部要把他們複製到應用程序目錄或系統目錄中,具體可根據情況靈活決定。在發佈應用程序之前,爲確定都需要包含哪些動態鏈接庫,一種比較可行又可靠的方法是:

  (1)將生成的應用程序拷貝到另一臺未裝過PowerBuilder的計算機上並運行它。

  (2)找出應用程序提示的因找不到而不能運行的那個動態庫。

  (3)從開發該應用程序的機器上將相應的動態庫文件拷貝過來。

  (4)重複(2)(3)兩步,直到所有動態鏈接庫都包含進來。

安裝程序的製作

  在Windows平臺上開發的應用程序不能象在DOS環境下經過簡單的COPY就可發佈和安裝。因此,製作一個安裝程序(Setup)就成爲Windows平合應用程序發佈的必不可少的重要一步。

  1、Setup的基本功能

  Setup程序的唯一目的就是安裝應用程序,應該由它來完成對安裝過程的處理,Setup程序應具備以下基本功能:

  (1)傳送文件。將需要安裝的應用程序及有關的支持文件傳送到目標機器上,並處理傳送過程中的錯誤。此乃Setup程序最基本的功能。

  (2)詢問終端用戶有關必要的信息,如用戶名、產品序列號、目標路徑等,並響應用戶輸入。

  (3)給用戶以改變想法的機會,如改變安裝路徑、取消安裝等。

  (4)註冊表訪問。如設置應用程序查找路徑鍵、創建應用程序信息鍵等。

  (5)卸載功能,對安裝的文件及對註冊表的設置應有卸載登記功能,以便用戶在取消安裝或在不需要時順利卸載應用程序並改回註冊表。

  (6)安裝完畢應給用戶以完成提示。

  2、應用程序的安裝規則

  當把應用程序安裝到機器上時,有許多規則應當遵從,其中大多數是常識性的。它們使用戶的應用程序維護更加容易,而且較少產生由文件複製而引起的問題。

  (l)應避免把任何文件拷貝到系統目錄中,除非正在升級由外部的應用程序使用的常用文件(例如,ODBC或本機數據庫驅動程序)。這有助於避免由於改變了這些區域的文件而使操作系統的性能降級。

  (2)如果文件是一個僅在單個用戶的應用程序之間共享的通用文件,就應在Program Files的子目錄Common Files中建立一個入口。

  (3)在 Windows中,應把用戶自己的應用程序放在Program Flies下自己的目錄中。

  (4) 對於 Windows應把支持文件( .hlp、.dll等)分佈在稱爲System用戶自己的應用程序的一個子目錄中。然後將它的位置註冊在應用程序的HKEY_LOCALMACHINE\software入口處的AppPathS子鍵的註冊表中。

  (5)應使用註冊表存儲有關應用程序的所有必需信息,而不應該修改system.ini、win.ini或應用程序的INI文件。

  (6)在操作系統的啓動引擎中製作一個入口,提供對用戶應用程序的訪問。對於Windows,應把應用程序的一個快捷圖標放在桌面或在開始菜單的程序文件夾中。

  (7)用戶放在系統目錄中的任何文件都應註冊於HKEY_LOCALMACHINE的sharedll子鍵中。

  3、安裝程序製作工具的選擇

  Installshield是InstallShield軟件公司開發的著名的安裝程序製作軟件。Installshield提供了易於使用的嚮導和一個集成環境來幫助創建應用程序安裝程序。但是InstallShield的使用比較複雜,InstallShield並不是自由軟件,而是一個有版權的商業化軟件。絕大部分PowerBuilder 8.0書籍資料在談及發佈應用程序時極其簡單地提示使用InstallShield製作安裝程序。而介紹InstallShield使用的資料又非常少。因而常會碰到不少困難。

  在製作中安裝程序時比較常用的安裝製作工具是CreateInstall 2000。它是一個共享軟件,支持中文。能在www.Gentee.com下載到。沒有註冊的話會在製作好的安裝盤運行時出現提示信息,但是功能是沒有限制的。

  另一個比InstallShield更加方便好用的安裝製作工具是GP-Install。GP-Install是一個用Delphi編制的自由軟件。雖然是自由軟件,但不是說它的功能就比較少,或者不夠強。正好相反,一個安裝軟件應該有的功能它一個不少,而且相當方便、實用。整個軟件安裝以後大約有2M,只是InstallShield的零頭。InstallShield有的功能GP-Install基本都有,生成的安裝程序界面也非常相似,但GP-Install更加讓人感到親切。GP-Install還有一個最大的特點就是允許生成帶有多國語言的安裝程序,在一個安裝程序中就包含了多種國家的語言,並且你在安裝時選擇了什麼語言,在反安裝(卸載)時也會顯示出什麼語言。這對於希望把自己的程序向其他國家、地區推廣的程序員來說是非常有用處的。GP-Install主頁:http://www.qsc.co.uk,你可以在那裏下載一個最新的版本,目前最新版本是5.0.2.57。

  其它還有一些比較常用的可用來製作安裝程序的軟件有Setup Factory 等。

  4、添加註冊表信息

  這是最關鍵的!涉及到ODBC的安裝和數據源的配置。千萬不能搞錯,否則前功盡棄。

  添加註冊表信息的方法有兩種:

  (1) 直接添加,主要見於手工添加數據源或創建安裝程序時。一般只須對下列項進行設置即可:

根鍵
子鍵
值名稱


HKEY_CURRENT_USER
Software\ODBC\ODBC.INI\demo(替換成你自己的數據源名稱)
AutoStop
Yes

HKEY_CURRENT_USER
同上
DatabaseName
Demo(替換成你自己的數據庫名稱)

HKEY_CURRENT_USER
同上
DatabaseFile
demo.db(替換成你自己的數據庫文件)

HKEY_CURRENT_USER
同上
Driver
C:\Program Files\Sybase\SQL Anywhere 7\win32\dbodbc7.dll

HKEY_CURRENT_USER
同上
PWD
Sql

HKEY_CURRENT_USER
同上
UID
Dba
  有時還須對下列項進行設置:

根鍵
子鍵
值名稱


HKEY_CURRENT_USER
Software\ODBC\ODBC.INI\demo(替換成你自己的數據源名稱)
Description
我的數據庫(替換成你對自己數據庫的描述,可以是中文)

HKEY_CURRENT_USER
同上
EngineName
我的數據庫(替換成自己的數據引擎描述,可以是中文)

HKEY_CURRENT_USER
同上
Start
C:\Program Files\Sybase\SQL Anywhere 7\win32\dbeng7.exe -c 8m,0

HKEY_LOCAL_MACHINE
software\ODBC\ODBC Drivers
Adaptive Server Anywhere 7.0
Installed

HKEY_LOCAL_MACHINE
software\ODBC\Adaptive Server Anywhere 7.0
Driver
C:\Program Files\Sybase\SQL Anywhere 7\win32\dbodbc7.dll

HKEY_LOCAL_MACHINE
software\ODBC\Adaptive Server Anywhere 7.0
Setup
C:\Program Files\Sybase\SQL Anywhere 7\win32\dbodbc7.dll

HKEY_CURRENT_USER
software\ODBC\ODBC.INI\ODBC Data Sources
你自己的數據源名稱如:demo
Adaptive Server Anywhere 7.0

HKEY_LOCAL_MACHINE
software\Microsoft\Windows\CurrentVersion\App Paths\MyApp.exe(替換成自己的可執行文件名)
Path
C:\Program Files\sybase\shared\PowerBuilder;
c:\program files\sybase\SQL Anywhere 7\win32\;C:\Program Files\Sybase\Shared\MerantODBC

HKEY_LOCAL_MACHINE
software\Microsoft\Windows\CurrentVersion\App Paths\MyApp.exe(替換成自己的可執行文件名)
Default
MyApp.exe(替換成自己的可執行文件名)
  以上各項爲註冊可執行文件和搜索路徑。你也可以改變爲另外的路徑。具體情況在製作安裝程序時靈活決定。

  (2) 在PowerBuilder中用程序來動態添加ODBC數據源,主要是利用 PowerBuilder對註冊表操作函數 RegistrySet(),再就是利用 PowerBuilder的ProfileString()函數和SetProfileString()函數讀取和設置INI配置文件中預先定義好的參數。

   RegistrySet( Key,Valuename,Valuetype,Value)

  功能:在PowerBuilder程序中設置註冊表中的信息。

  Key表示主鍵; Valuename表示鍵值名; Valuetype表示鍵值類型;Value表示鍵值。

   Profilestring(Filename,Section,Key,Value)

  功能:在PowerBuilde程序中讀取INI配置文件中的信息。

  Filename表示文件名;Section表示段名;Key表示關鍵字;Value表示關鍵字值。

   SetProfileString(Filename,Section,Key,Value)

  功能:在PowerBuilde程序中設置INI配置文件中的信息。

  Filename表示文件名;Section表示段名;Key表示關鍵字;Value表示關鍵字值。

  至此,ODBC和數據源就配置好了。 對不同的數據庫管理系統而言,上面的方法和語句會有所不同,但用戶可用以下方法作爲用程序添加ODBC數據源的依據:①在控制面板中打開ODBC數據源管理器,手動添加一數據源。②運行Regedit,打開註冊表編輯器,找到剛纔添加的數據源,記下其各鍵值的值。③在安裝程序中或在PowerBuilder程序中用 RegistSet()函數把各鍵值的值寫入註冊表。當然,某些鍵值肯定會不同,比如數據庫的具體路徑等。

  5、數據庫文件(.db)的移動處理

  在PowerBuilder 8.0中,SQL anywhere 數據庫由後綴分別爲.db和.log兩個文件組成,其中.db的文件是用來存放數據庫信息(包括表結構、視圖、數據等)。而.log文件是個日誌文件,用來記錄用戶每一次對數據庫有影響的操作,例如創建或刪除表、視圖、觸發器等對象,插入、刪除、修改表中的數據等。當我們建立一個SQL anywhere 數據庫時,除生成一個庫文件(.db)外,還默認建立相應的.log文件。

  移動SQL anywhere 數據庫時首先將.db文件和.log文件一同複製,配置ODBC, 再在PowerBuilder中設置Profile即可連通。但日誌文件(.log)經常會帶來一些麻煩,使數據庫不能方便地移動到別的機器上使用。因爲如果SQL anywhere在創建數據庫的時候把日誌文件的路徑信息存放到了數據庫中,那麼你把數據庫拷貝到另外一臺機子上時,如果目錄不一樣,則數據庫就連不上了。

  一般的解決方法是:在終端用戶機器上建立一個對應的目錄。即如果在建立該庫時的.log文件路徑爲:H:\Pb8.0\share\myapp.log,則在終端用戶機器上先建立一個盤號爲H:的虛擬盤,再建立相應的目錄,將myapp.log拷貝到該目錄中(也可不拷,則重新建立.log日誌文件),即可打開並調用數據庫了。另一種解決辦法是:重新註冊.log文件,在DOS模式下進入SQL anywhere 的Win32目錄, 運行DBLOG -T X1:\PATH1\XXX.LOG X2:\PATH2\XXX.DB。其中X1:\PATH1\XXX.LOG是生成的新.log文件要放的路徑和名稱。X2:\PATH2\XXX.DB是你現在應用程序要使用的.db文件。注意不要搞錯了。

  一般情況下,若不是要求太高,可省略掉.log文件,即在建庫時不要附帶.log文件,這樣庫文件移動起來也就方便一些。

  突然斷電或不正常關機或你不小心操作都有可能破壞SQLAnywhere的數據,由此造成很大的損失,如果只損壞了.db文件而.log還正常,則可以恢復被破壞的數據庫的的大部分數據,只要把.log文件的內容轉換成一條條的SQL語句,然後再建一個空的數據庫,再執行這些SQL語句,則恢復數據的問題就解決了。Sybase公司提供了幾個實用程序來完成以上功能。

  現假設數據庫系統文件分別名爲myapp.db和myapp.log。如果myapp.db已被破壞。現在創建一個新的數據庫,假設文件分別名爲new.db和new.log。

  用Sybase提供的dbtranw.exe,db32w.exe,rtsqlw.exe等實用程序來完成恢復工作,步驟如下:

  1.dbtranw -r-k-y myapp.log db.sql // 把.log文件的內容轉換成的SQL語句
  2.attrib -r myapp.db // 修改只讀文件myapp.db的屬性爲可寫
  3.attrib-r myapp.log // 修改只讀文件myapp.log的屬性爲可寫
  4.copy new.db myapp.db // 用新的空庫文件覆蓋被破壞的舊庫文件
  5.copy new.log myapp.log // 用新的日誌文件覆蓋舊的日誌文件
  6.db32w.exe -d myapp.db // 啓動數據庫SQLAnywhere
  7.rtsqlw-q-c "userid=dba;password=sql " read db.sql // 執行從.log文件中倒出來的SQL語句

  其中第一步的功能是把舊的日誌文件轉換成SQL語句,並放在一個名爲db.sql的文件中,特別注意它只能在第五步之前操作,否則日誌文件會被new.log所覆蓋,而導致無法恢復數據。最後一步的功能是從文件db.sql中讀取SQL語句並執行,假設數據庫的用戶名爲dba,而口令爲sql。有關各個命令及參數據的更詳細的用法可以查看相應的幫助。注意:.log文件不能隨便刪除,否則恢復的數據就不完整。

  結束語

  本文就基於Windows平臺的的PowerBuilder 8.0應用程序編譯發佈的關鍵問題進行了分析,並給出了詳細的解決方法,主要包括開發PowerBuilder 8.0應用程序時,執行文件的建立、資源文件的創建、安裝程序的建立及添加數據源和SQL anywhere 數據庫移動處理等問題。該方法並不限於Powerbuilder,對其它開發工具同樣有借鑑意義。所論技術已在廣西師大計算機系研究生綜合管理系統MPS開發中得到驗證。同時,該技術已應用於多個管理信息系統中,收到了良好的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章