滿洲里出入境檢驗(yàn)檢疫局 姜曉龍
PB客戶端軟件自動(dòng)升級(jí)的設(shè)計(jì)與實(shí)現(xiàn)
滿洲里出入境檢驗(yàn)檢疫局 姜曉龍
PB(PowerBuilder)應(yīng)用程序的客戶端系統(tǒng)更新絕大多數(shù)采用本地計(jì)算機(jī)完全式安裝或拷貝式安裝進(jìn)行,CS模式的程序設(shè)計(jì)在系統(tǒng)更新環(huán)節(jié)上確實(shí)浪費(fèi)了大量的人力、物力和工作時(shí)間。本文詳細(xì)地介紹一種局域網(wǎng)內(nèi)客戶端軟件自動(dòng)升級(jí)的實(shí)現(xiàn)方法,它將有效地減輕客戶端程序升級(jí)工作的重荷,彌補(bǔ)CS結(jié)構(gòu)的系統(tǒng)在更新任務(wù)方面的不足和缺陷。
客戶端軟件;自動(dòng)升級(jí);文件服務(wù)器;配置文件;程序版本
在較大的CS結(jié)構(gòu)的管理系統(tǒng)中,需求的變化、補(bǔ)丁的加載以及系統(tǒng)的升級(jí)等原因?qū)е聦?duì)客戶端應(yīng)用程序的修改會(huì)帶來(lái)大量的客戶端更新工作。維護(hù)人員必須到每臺(tái)客戶機(jī)去更新安裝,這就大大加重了維護(hù)人員的工作量。在客戶端計(jì)算機(jī)數(shù)量相對(duì)較少的情況下這種情形還可以忍受,倘若局域網(wǎng)內(nèi)存在數(shù)十臺(tái)乃至幾百臺(tái)等待更新的機(jī)器,而網(wǎng)絡(luò)節(jié)點(diǎn)分布又不集中,其工作強(qiáng)度將是不言而喻的。因此,實(shí)現(xiàn)PB客戶端軟件自動(dòng)升級(jí)的必要性是毋庸置疑的,它可以充分彌補(bǔ)CS模式在系統(tǒng)升級(jí)換代方面存在的不足和缺陷。本文結(jié)合出口果蔬隨附單據(jù)無(wú)紙化報(bào)檢系統(tǒng)客戶端應(yīng)用程序自動(dòng)升級(jí)的解決方案,介紹一種局域網(wǎng)內(nèi)可自動(dòng)升級(jí)客戶端軟件的實(shí)現(xiàn)方法。
PB客戶端應(yīng)用程序?qū)崿F(xiàn)自動(dòng)升級(jí)的技術(shù)原理是在局域網(wǎng)內(nèi)專門放置一臺(tái)文件服務(wù)器或直接使用現(xiàn)有的數(shù)據(jù)服務(wù)器,存放最新的應(yīng)用程序文件和配置文件。啟動(dòng)客戶端程序自動(dòng)升級(jí)功能時(shí),應(yīng)用程序首先執(zhí)行配置文件,提取相應(yīng)的升級(jí)參數(shù),即本地計(jì)算機(jī)應(yīng)用程序的版本、服務(wù)器名稱或地址以及服務(wù)器保存更新文件的共享文件夾;接著根據(jù)所提取的服務(wù)器名稱或地址和共享目錄,到文件服務(wù)器下載最新應(yīng)用程序的版本信息;然后比較服務(wù)器程序版本與本地程序版本,如果服務(wù)器程序版本高于本地程序版本,說(shuō)明文件服務(wù)器上已存在更加新版的客戶端應(yīng)用程序,則提示用戶是否對(duì)本地計(jì)算機(jī)應(yīng)用程序進(jìn)行更新操作,最后再運(yùn)行新升級(jí)的主程序。
⑴創(chuàng)建一個(gè)INI類型的配置文件CSUpgrade.ini,其具體內(nèi)容如下:
[Options]
Version=網(wǎng)絡(luò)版V8.2.11.0723
//程序版本號(hào),比較本地程序版本與服務(wù)器程序版本是否一致
Server=\10.15.10.1
//文件服務(wù)器名稱或IP地址
Folder=CSUpgrade
//存放更新文件的共享文件夾
File=CS2010.exe|CS2010.dll|DBConfig.exe|EDecl.exe
//存放應(yīng)用程序文件列表并以分隔符“|”間隔
Notes=新增了流程控制、系統(tǒng)日志、大寫中文數(shù)字發(fā)音拼寫檢查、數(shù)據(jù)源的自動(dòng)配置和OLE控件的自動(dòng)注冊(cè)以及圖片按鈕和XP風(fēng)格按鈕等實(shí)用功能。
//告知客戶端用戶需要更新的主要內(nèi)容說(shuō)明或注釋文本
⑵在用于更新提示的窗口中自定義一個(gè)函數(shù)wf_GetFileNameL-ist,用于從文件服務(wù)器提供的配置文件的文件列表中取得各個(gè)需要進(jìn)行升級(jí)的文件,分別存放在一個(gè)數(shù)組中,并返回升級(jí)文件的個(gè)數(shù)。
⑶定義窗口用戶事件ue_postopen,用于比較本地程序版本與服務(wù)器程序版本是否一致。如果服務(wù)器程序版本與本地程序版本互相一致,則直接啟動(dòng)系統(tǒng)的主程序,同時(shí)關(guān)閉自動(dòng)升級(jí)窗口;如果服務(wù)器程序版本高于本地程序版本,則提取文件服務(wù)器提供的配置文件的注釋文本,以便用戶決定是否進(jìn)行本地計(jì)算機(jī)應(yīng)用程序的更新工作,主要程序腳本如下:
Ls_Local_INIFile=’CSUpgrade.ini’
//本地或服務(wù)器INI配置文件名稱
Ls_Local_Version=ProfileString(Ls_Local_INIFile,’Options’,’Version’,’’)
//本地應(yīng)用程序版本
SELECT Server_Path,File_Folder INTO :Ls_Server,:Ls_Server_Folder FROM T_CS_Parameter;
//提取文件服務(wù)器名稱或IP地址以及共享文件夾
Ls_Server_Folder=Ls_Server + ‘’ + Ls_Server_Folder + ‘’
//設(shè)置文件服務(wù)器路徑
Ls_Server_INIFile=Ls_Server_Folder + ‘CSUpgrade.ini’
//設(shè)置文件服務(wù)器端的INI配置文件
Ls_Server_Version=ProfileString(Ls_Server_INIFile,’Options’,’Version’,’’)
//獲取文件服務(wù)器程序版本
Ls_File=ProfileString(Ls_Server_INIFile,’Options’,’File’,’’)
//獲取更新文件列表
Ls_Notes=ProfileString(Ls_Server_INIFile,’Options’,’Notes’,’’)
//獲取更新說(shuō)明
IF(Ls_Server_Versiongt;Ls_Local_Version)THEN
//比較本地與服務(wù)器程序版本號(hào)
This.Show()
//顯示自動(dòng)更新窗口
mle_1.text=’文件服務(wù)器存在新的版本應(yīng)用程序,說(shuō)明如下:~r~n”’ +Ls_Notes + ‘”~r~n您是否更新本地應(yīng)用程序?’
//顯示客戶端軟件需要更新的文本說(shuō)明
ELSE
Run(‘CS2010.exe’) ; Halt Close
//啟動(dòng)主程序并退出自動(dòng)更新窗口
END IF
⑷“更新(R)”按鈕主要實(shí)現(xiàn)的功能是進(jìn)行自動(dòng)升級(jí)程序的創(chuàng)建過(guò)程,自動(dòng)更新過(guò)程界面效果如右圖所示。編寫如下主要腳本:
Li_FileCount=wf_getfilename(Ls_File)
//獲取文件列表并保存在Is_FileName[]數(shù)組中
L s_Text=”程序更新開始:” + String(Today(),’yyyy-mm-dd’) + ‘ ‘ +String(Now()) + ‘ ‘ + ayName(Today())
Lit_CSUpgrade_Start=CPU()
//獲取自動(dòng)更新的開始時(shí)間計(jì)數(shù)
mle_1.text=Ls_Text
mle_1.text=mle_1.text + ‘~r~n’ + ‘---’ //設(shè)置分隔符,記錄自動(dòng)更新過(guò)程并實(shí)時(shí)顯示
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())
//更新本地計(jì)算機(jī)INI文件并標(biāo)注拷貝完成時(shí)間
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())
//更新本地計(jì)算機(jī)程序文件并標(biāo)注拷貝完成時(shí)間
mle_1.text=mle_1.text + Ls_Text
mle_1.Scroll(i * 2)
//滾動(dòng)系統(tǒng)當(dāng)前光標(biāo)位置
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()
//獲取自動(dòng)更新的結(jié)束時(shí)間計(jì)數(shù)
Ls_Text=Ls_Text + ‘ ‘ + String(Round(Long((Lit_CSUpgrade_End - Lit_CSUpgrade_Start) * 0.001),3))
mle_1.text=mle_1.text + Ls_Text
//統(tǒng)計(jì)自動(dòng)更新用時(shí)并顯示自動(dòng)更新全部日志
⑸當(dāng)服務(wù)器程序更新時(shí),技術(shù)人員只需將配置文件CSUpgrade.ini和最新版本的程序存放到文件服務(wù)器的配置文件的Folder項(xiàng)指定的目錄,并修改CSUpgrade.ini文件的程序版本號(hào)(Version)、需要更新的文件列表(File)和升級(jí)注解(Notes)等各項(xiàng)內(nèi)容即可,但必須保證服務(wù)器程序的版本號(hào)高于客戶端程序的版本號(hào)。
⑹實(shí)現(xiàn)圖標(biāo)欄隱式運(yùn)行升級(jí)任務(wù)。圖標(biāo)欄的應(yīng)用為客戶端軟件的自動(dòng)升級(jí)增光添色,它可以實(shí)現(xiàn)完全隱藏的運(yùn)行升級(jí)程序窗口。系統(tǒng)自動(dòng)升級(jí)窗口運(yùn)行后,在Windows操作系統(tǒng)的圖標(biāo)欄中顯示該應(yīng)用程序的圖標(biāo)。根據(jù)提取到的升級(jí)參數(shù)比較兩地程序的版本,當(dāng)服務(wù)器程序版本與本地程序版本一致時(shí),直接調(diào)用系統(tǒng)的主程序并關(guān)閉自動(dòng)升級(jí)提示窗口;而當(dāng)服務(wù)器程序版本高于本地程序版本時(shí),彈出自動(dòng)更新窗口并顯示升級(jí)程序的文本注釋。
PB客戶端軟件自動(dòng)升級(jí)技術(shù)已經(jīng)在各類檢驗(yàn)檢疫輔助通關(guān)系統(tǒng)中成功應(yīng)用,系統(tǒng)更新時(shí)發(fā)揮出的作用特別明顯,可以使客戶端的更新工作在本地計(jì)算機(jī)自動(dòng)完成,無(wú)需維護(hù)人員到每臺(tái)客戶機(jī)去更新安裝,從而最大限度地減少了維護(hù)的工作量,提高了技術(shù)人員的工作效率。
[1]柯建勛,張濤,邵亮編著.PowerBuilder9.0實(shí)例與技巧[M].北京:清華大學(xué)出版社,2003.
[2]侯志平,等.編著.PowerBuilder6.0參考手冊(cè)[M].北京:曉通數(shù)據(jù)庫(kù)研究與發(fā)展中心,2001.
姜曉龍(1977-),男,高級(jí)工程師,計(jì)算機(jī)數(shù)據(jù)庫(kù)應(yīng)用程序設(shè)計(jì)與開發(fā)。