滿洲里出入境檢驗檢疫局 姜曉龍
PB客戶端軟件自動升級的設計與實現
滿洲里出入境檢驗檢疫局 姜曉龍
PB(PowerBuilder)應用程序的客戶端系統更新絕大多數采用本地計算機完全式安裝或拷貝式安裝進行,CS模式的程序設計在系統更新環節上確實浪費了大量的人力、物力和工作時間。本文詳細地介紹一種局域網內客戶端軟件自動升級的實現方法,它將有效地減輕客戶端程序升級工作的重荷,彌補CS結構的系統在更新任務方面的不足和缺陷。
客戶端軟件;自動升級;文件服務器;配置文件;程序版本
在較大的CS結構的管理系統中,需求的變化、補丁的加載以及系統的升級等原因導致對客戶端應用程序的修改會帶來大量的客戶端更新工作。維護人員必須到每臺客戶機去更新安裝,這就大大加重了維護人員的工作量。在客戶端計算機數量相對較少的情況下這種情形還可以忍受,倘若局域網內存在數十臺乃至幾百臺等待更新的機器,而網絡節點分布又不集中,其工作強度將是不言而喻的。因此,實現PB客戶端軟件自動升級的必要性是毋庸置疑的,它可以充分彌補CS模式在系統升級換代方面存在的不足和缺陷。本文結合出口果蔬隨附單據無紙化報檢系統客戶端應用程序自動升級的解決方案,介紹一種局域網內可自動升級客戶端軟件的實現方法。
PB客戶端應用程序實現自動升級的技術原理是在局域網內專門放置一臺文件服務器或直接使用現有的數據服務器,存放最新的應用程序文件和配置文件。啟動客戶端程序自動升級功能時,應用程序首先執行配置文件,提取相應的升級參數,即本地計算機應用程序的版本、服務器名稱或地址以及服務器保存更新文件的共享文件夾;接著根據所提取的服務器名稱或地址和共享目錄,到文件服務器下載最新應用程序的版本信息;然后比較服務器程序版本與本地程序版本,如果服務器程序版本高于本地程序版本,說明文件服務器上已存在更加新版的客戶端應用程序,則提示用戶是否對本地計算機應用程序進行更新操作,最后再運行新升級的主程序。
⑴創建一個INI類型的配置文件CSUpgrade.ini,其具體內容如下:
[Options]
Version=網絡版V8.2.11.0723
//程序版本號,比較本地程序版本與服務器程序版本是否一致
Server=\10.15.10.1
//文件服務器名稱或IP地址
Folder=CSUpgrade
//存放更新文件的共享文件夾
File=CS2010.exe|CS2010.dll|DBConfig.exe|EDecl.exe
//存放應用程序文件列表并以分隔符“|”間隔
Notes=新增了流程控制、系統日志、大寫中文數字發音拼寫檢查、數據源的自動配置和OLE控件的自動注冊以及圖片按鈕和XP風格按鈕等實用功能。
//告知客戶端用戶需要更新的主要內容說明或注釋文本
⑵在用于更新提示的窗口中自定義一個函數wf_GetFileNameL-ist,用于從文件服務器提供的配置文件的文件列表中取得各個需要進行升級的文件,分別存放在一個數組中,并返回升級文件的個數。
⑶定義窗口用戶事件ue_postopen,用于比較本地程序版本與服務器程序版本是否一致。如果服務器程序版本與本地程序版本互相一致,則直接啟動系統的主程序,同時關閉自動升級窗口;如果服務器程序版本高于本地程序版本,則提取文件服務器提供的配置文件的注釋文本,以便用戶決定是否進行本地計算機應用程序的更新工作,主要程序腳本如下:
Ls_Local_INIFile=’CSUpgrade.ini’
//本地或服務器INI配置文件名稱
Ls_Local_Version=ProfileString(Ls_Local_INIFile,’Options’,’Version’,’’)
//本地應用程序版本
SELECT Server_Path,File_Folder INTO :Ls_Server,:Ls_Server_Folder FROM T_CS_Parameter;
//提取文件服務器名稱或IP地址以及共享文件夾
Ls_Server_Folder=Ls_Server + ‘’ + Ls_Server_Folder + ‘’
//設置文件服務器路徑
Ls_Server_INIFile=Ls_Server_Folder + ‘CSUpgrade.ini’
//設置文件服務器端的INI配置文件
Ls_Server_Version=ProfileString(Ls_Server_INIFile,’Options’,’Version’,’’)
//獲取文件服務器程序版本
Ls_File=ProfileString(Ls_Server_INIFile,’Options’,’File’,’’)
//獲取更新文件列表
Ls_Notes=ProfileString(Ls_Server_INIFile,’Options’,’Notes’,’’)
//獲取更新說明
IF(Ls_Server_Versiongt;Ls_Local_Version)THEN
//比較本地與服務器程序版本號
This.Show()
//顯示自動更新窗口
mle_1.text=’文件服務器存在新的版本應用程序,說明如下:~r~n”’ +Ls_Notes + ‘”~r~n您是否更新本地應用程序?’
//顯示客戶端軟件需要更新的文本說明
ELSE
Run(‘CS2010.exe’) ; Halt Close
//啟動主程序并退出自動更新窗口
END IF
⑷“更新(R)”按鈕主要實現的功能是進行自動升級程序的創建過程,自動更新過程界面效果如右圖所示。編寫如下主要腳本:

Li_FileCount=wf_getfilename(Ls_File)
//獲取文件列表并保存在Is_FileName[]數組中
L s_Text=”程序更新開始:” + String(Today(),’yyyy-mm-dd’) + ‘ ‘ +String(Now()) + ‘ ‘ + ayName(Today())
Lit_CSUpgrade_Start=CPU()
//獲取自動更新的開始時間計數
mle_1.text=Ls_Text
mle_1.text=mle_1.text + ‘~r~n’ + ‘---’ //設置分隔符,記錄自動更新過程并實時顯示
Ls_Text=’~r~n’ + String(0) + ‘、’ + “版本:” + Ls_Local_Version +“→” + Ls_Server_Version
mle_1.text=mle_1.text + Ls_Text + ‘~r~n’ + ‘---’
Li_Rtn=FileCopy(ls_Server_Folder + Ls_Local_INIFile,Ls_Local_INIFile,True)
IF(Li_Rtn=1)THEN ; Ls_Flag=’成功!’ ; ELSE ; Ls_Flag=’失敗!’ ; END IF
Ls_Text=’~r~n’ + String(1) + ‘、’ + “文件:” + Ls_Local_INIFile + ‘更新’ + Ls_Flag + String(Today(),’yyyy-mm-dd’) + ‘ ‘ + String(Now())
//更新本地計算機INI文件并標注拷貝完成時間
mle_1.text=mle_1.text + Ls_Text
FOR i = 1 TO Li_FileCount
//依次更新程序文件
Li_Rtn=FileCopy(ls_Server_Folder + Is_FileName[i],Is_FileName[i],True)
IF(Li_Rtn=1)THEN ; Ls_Flag=’成功!’ ; ELSE ; Ls_Flag=’失敗!’ ; END IF
Ls_Text=’~r~n’ + String(i+1) + ‘、’ + “文件:” + Is_FileName[i] + ‘更新’+ Ls_Flag + String(Today(),’yyyy-mm-dd’) + ‘ ‘ + String(Now())
//更新本地計算機程序文件并標注拷貝完成時間
mle_1.text=mle_1.text + Ls_Text
mle_1.Scroll(i * 2)
//滾動系統當前光標位置
NEXT
UPDATE T_CS_Parameter SET Programme_Edition = :Ls_Server_Version;
//更新客戶端的最新顯示版本
mle_1.text=mle_1.text + ‘~r~n’ + ‘---’
Ls_Text=”程序更新完畢:” + String(Today(),’yyyy-mm-dd’) + ‘ ‘ +String(Now()) + ‘ ‘ + DayName(Today())
SetProfileString(Ls_Local_INIFile,’Options’,’File’,’’)
SetProfileString(Ls_Local_INIFile,’Options’,’Notes’,’’)
Lit_CSUpgrade_End=CPU()
//獲取自動更新的結束時間計數
Ls_Text=Ls_Text + ‘ ‘ + String(Round(Long((Lit_CSUpgrade_End - Lit_CSUpgrade_Start) * 0.001),3))
mle_1.text=mle_1.text + Ls_Text
//統計自動更新用時并顯示自動更新全部日志
⑸當服務器程序更新時,技術人員只需將配置文件CSUpgrade.ini和最新版本的程序存放到文件服務器的配置文件的Folder項指定的目錄,并修改CSUpgrade.ini文件的程序版本號(Version)、需要更新的文件列表(File)和升級注解(Notes)等各項內容即可,但必須保證服務器程序的版本號高于客戶端程序的版本號。
⑹實現圖標欄隱式運行升級任務。圖標欄的應用為客戶端軟件的自動升級增光添色,它可以實現完全隱藏的運行升級程序窗口。系統自動升級窗口運行后,在Windows操作系統的圖標欄中顯示該應用程序的圖標。根據提取到的升級參數比較兩地程序的版本,當服務器程序版本與本地程序版本一致時,直接調用系統的主程序并關閉自動升級提示窗口;而當服務器程序版本高于本地程序版本時,彈出自動更新窗口并顯示升級程序的文本注釋。
PB客戶端軟件自動升級技術已經在各類檢驗檢疫輔助通關系統中成功應用,系統更新時發揮出的作用特別明顯,可以使客戶端的更新工作在本地計算機自動完成,無需維護人員到每臺客戶機去更新安裝,從而最大限度地減少了維護的工作量,提高了技術人員的工作效率。
[1]柯建勛,張濤,邵亮編著.PowerBuilder9.0實例與技巧[M].北京:清華大學出版社,2003.
[2]侯志平,等.編著.PowerBuilder6.0參考手冊[M].北京:曉通數據庫研究與發展中心,2001.
姜曉龍(1977-),男,高級工程師,計算機數據庫應用程序設計與開發。