程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> 西安市電信局“九七工程”系統集成技巧

西安市電信局“九七工程”系統集成技巧

編輯:SyBase綜合文章
郵電部的"九七工程"是一個大型數據庫綜合應用系統,其全稱是"電信業務計算機綜合應用系統",整個系統囊括了當今先進的計算機、數據庫及網絡技術。西安市電信局"九七工程"客戶端的開發環境為英文Windows95配合中文之星2.5,使用Sybase大型數據庫系統及其開發工具PowerBuilder5.0。一期工程整個系統網絡連接二百余台計算機,應用端程序代碼幾十萬行。在對這樣一個大型系統進行集成的過程中,使用了多種技巧,對Windows95環境進行設置,對應用程序加以改進,在實踐中獲得了一套行之有效的措施,用來對付整個系統應用過程中的各類問題。之所以稱為"技巧"而不是"技術",是因為所使用的各種方法,有的可能只是一個設置的改動,有的只是四五行源代碼的集合。但就是這些設置和代碼,在整個系統的應用中起了十分重要的作用。下面分三個方面來介紹這些設置和代碼。

設置客戶端計算機為"九七"專用系統

  基於對系統安全和設備管理的考慮,我們希望運行"九七工程"系統的計算機成為一個專用計算機,也就是說當計算機啟動時自動加載應用程序,退出應用程序後自動關閉計算機。為此我們對系統進行了一系列設置:

  1、更改系統啟動畫面 啟動畫面使用一個320*400大小的256色BMP圖象文件,文件名為logo.sys,並將其放置在C盤的根目錄下,這樣在以後Win95每次啟動時就可以使用自己制作的畫面作為啟動畫面了。如果還希望改動關機畫面,用類似的方法修改Windows目錄下的logos.sys和logow.sys文件就可以了。
  2、 計算機啟動時直接進入"九七系統"的應用界面   "九七系統"有一個封面程序Shell1.exe,通過這個封面進行數據庫的連接,輸入工號和口令,進行用戶身份驗證,並根據用戶工號的編碼特征運行相應的應用程序。在用戶打開計算機電源的時候,我們就希望能夠使計算機直接啟動這個封面程序。對這個問題,在Win95中的實現一般有兩種方法,簡單的一種是在Start菜單的Program\Startup中加入封面程序;另一個稍微麻煩,是在系統注冊表的HKEY_LOCAL_MacHINE \SOFTWARE \Microsoft \Windows \CurrentVersion \Run下加入封面程序。這兩個方法是最通用的,但考慮到系統本身的特點,卻是不可行的。"九七系統"是一個專用系統,不僅基於系統安全和設備管理的考慮,我們希望運行"九七工程"系統的計算機成為一個專用計算機,而且由於"九七系統"計算機的最終用戶大多沒有經過Windows95使用的培訓,如果呈現在用戶面前的東西太多,必然會對系統的安全構成潛在的威脅。因此,在實際的應用中,我們采用的是修改Windows目錄下的System.ini文件的方法。在System.ini文件中有一個關於Windows95外殼程序的設置,在缺省情況下,外殼程序為Explorer.exe,即Shell=Explorer.exe,我們將其改為Shell=c:\apply\shell1.exe(封面程序統一放置在c:\apply目錄下),這樣,當Win95啟動時會直接進入我們自己的封面程序,同時用戶還看不到包括"開始"、桌面、我的電腦、網絡鄰居和回收站等所有的東西,真正將計算機做成了"九七系統"專用。
  3、 漢字系統的加載   為了使計算機成為"九七系統"專用,我們對System.ini文件進行了改動,結果是犧牲掉了漢字系統。我們的應用程序在開發時使用的是英文Windows95和中文之星2.5,在對System.ini文件進行改動之後,桌面和"開始"都不見了蹤影,中文之星自然也就啟動不了了。而且比較麻煩的一點是中文之星的自動啟動並不是包含在Windows的Startup中,也不是包含在注冊表的run下面,而且我們網絡上的二百多台微機是分了好幾批進行軟件安裝的,使用的中文系統雖然大部分是中文之星2.5,但仍有相當一部分使用的是中文之星2.0,他們的安裝目錄名並不相同,這就為從我們的封面程序直接啟動中文之星帶來了不便。但我們對Windows95的啟動過程進行了較為細致的分析,最終發現中文之星的自動啟動是在Win.ini文件中設置的,因此,我們可以通過讀取Win.ini 這個文件來直接獲得中文之星執行文件的文件名和絕對路徑,當然,有了路徑和文件名之後只須用PowerBuilder 在程序適當的地方加一句run( CstarPath )的語句,不論中文之星的版本號是多少,也不用專門設定路徑就可以順利啟動中文系統。   
  4、 實現程序自動關機   完成了以上幾項設置後,計算機就象是一個專用系統了。但是,當我們把自己的封面程序設置成為Win95的外殼程序後,Start菜單不見了蹤影,ShutDown自然無處可尋,計算機的安全關閉成了隨之而來的問題。通過對Windows API的研究我們知道,一個應用程序可以通過調用標准函數ExitWindowsEx()完成計算機的自動關閉。這個函數有兩個參數,前一個用來確定計算機關閉的方式,例如EWX_LOGOFF關閉所有應用程序並以其它用戶身份登錄,EWX_POWEROFF退出Windows後關閉計算機電源(要求計算機支持軟件關閉電源),

EWX_SHUTDOWN退出Windows後停留在"You can shutdown your computer safely"的地方,EWX_REBOOT重新啟動計算機;後一個參數保留。當程序調用這個函數後,它向所有的進程發送CTRL_SHUTDOWN_EVENT或 CTRL_LOGOFF_EVENT消息,要求所有進程立即結束運行准備退出Windows95系統。可以使用兩種方法調用這個函數,一是在Visual C++中編寫程序調用這個函數,編譯成為EXE文件後在PowerBuilder中用run()命令調用運行。用VC編程調用這個函數完成自動關機的功能十分方便,另外只要將VC編譯出的EXE文件改名或刪除,自動關機功能就不能實現,算是為維護人員修改計算機設置提供了方便,這是使用這種方法實現自動關機的好處。另一種調用關機函數的方法是在PowerBuilder中直接定義後使用。在PowerBuilder中的Global External Function中定義Function boolean ExitWindowsEx( uint uFlags, ulong dwReserved ) library "user32.dll"後,就可以在PowerBuilder的程序當中直接調用這個關機函數完成自動關機的任務。這種方法的好處也是顯而易見的,它看起來比前一種方法更緊湊。   實現程序自動關機後雖然有許多好處,但同時給維護人員的維護工作帶來了不便,我們的解決方法是如果在進行自動關機的過程中按住Shift鍵不放,則只關閉自己的應用程序而不是整個Windows系統都退出。具體實現是在封面程序的Close事件中加入下面的語句: if KeyDown( KeyShift! ) = 0 then ExitWindows( 1, 0 ) end if   方法很簡單,但確實行之有效。另外,我們還可以更進一步在關閉封面程序的同時啟動資源管理器,方便維護人員工作。
  5、撥號上網計算機的設置   對於"九七系統"這樣一個城域網來說,網線是不可能布通整個西安市的每個角落的,特別是對於一些地處郊縣的遠程點,最經濟的方法就是撥號上網。當然,由於運行環境的不同,為我們的系統界面提出了新的要求--每次進入系統後能夠自動撥號入網。   對於這個問題,我們首先想到的方法是模仿前面中文之星的啟動方法,找到撥號網絡的應用程序後由程序自動調用。但事實是怎麼樣呢?撥號網絡的應用是隱含在Exporer.exe當中的,如果在命令行的狀態下鍵入EXPLORER.EXE::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{992CFFA0-F557-101A-88EC-00DD010CCC48},系統就可以啟動打開撥號網絡的窗口。不過這距離我們需要的還有一步距離,那就是雙擊撥號網絡中的特定圖標,真正開始撥號上網注冊連接的過程。其實,在進入系統時能夠自動化撥號上網,Win95已經考慮到了這個問題。在Control Panel中的Internet 下,有一個connect的書夾,選擇Auto connect to internet,同時選擇自己需要的撥號設置後,就可以在每次進入系統的過程中首先自動撥號連接數據庫了。當然,在進行撥號設置時還可以根據需要要求保護用戶名和口令,這樣撥號連接入網就實現了全自動,而且還保證了與其他使用網線的計算機的界面的統一性。

確保系統正常運行

  為了保證系統的正常運行,我們進行了如下的設置:

  1、保證應用程序窗口在封面程序之上

  封面程序和具體的應用程序一旦都運行之


您正在看的Sybase教程是:西安市電信局“九七工程”系統集成技巧。後,兩者之間的關系對操作系統來說是平等的,任何其一都有可能在另一窗口之上,從而遮擋住另一程序。一般來說應用程序運行在後,其窗口也就在上,但也可能由於某些操作,使封面程序的窗口位於應用程序之上,這樣就使得操作者可能誤以為應用程序已經關閉。解決的方法是將封面程序總保持在其他應用程序之下。Win95窗口的排列順序使用的是稱之為Z序的排列方式,當窗口的句柄位於Z序最下面時,窗口也位於其他所有窗口之下。具體的實現方法是:在Global External Function中定義兩個Windows API函數:

  Function boolean FindWindow(string class,string title)library "user32.dll"Function boolean SetWindowPos(uint hWnd, uint hWndInsertAfter, int x, int y,int cx,int cy, uFlags) library "user32.dll" 在Global Function 中定義函數 boolean set2bottom(string winName), 代碼為: string NULL uint Handle SetNULL(NULL) Handle=FindWindow(NULL, winName) if Handle=0 then return false end if SetWindowPos(Handle,1,-1,-1,-1,-1,3)

  這樣,只要在適當的時候調用set2bottom函數,用封面窗口的名稱作為字符串參數,就可以將封面程序的窗口設置為在其他窗口的下面。但還有一個問題需要考慮的是,這個函數無法讓窗口總保持在其他窗口之下,不過可以通過變通地在封面程序中設定定時時鐘,每過一段時間譬如5秒就調用一次這個函數,這樣從另一種途徑實現了窗口總保持在其他窗口之下。   

  就這個問題,還有一個類似的解決方法,那就是將應用程序設置為總保持在其他窗口之下,這樣做和前一種方法是等效的。具體實現也是類似的,只是SetWindowPos函數的參數為SetWindowPos(Handle,-1,-1,-1,-1,-1,3)   

  2、保證系統正常運行

  應用程序有時打開的太多,結果會造成死機。為了保證系統的正常運行,我們定義了下面的函數:

  Function uint FindWindowA(String class, String title) library "user32.dll" Function boolean SetWindowPos(uint hWnd, uint hWinInsertAfter, int X, int Y, int cx, int cy, uint uFlags) library "user32.dll" Function boolean ShowWindow(uint hWnd, int nCmdShow) library "user32.dll" Function uint GetLastActivePopup(uint hWnd) library "user32.dll" Function uint BringWindowToTop(uint hWnd) library "user32.dll" Function boolean set2top(string winName) library "extFunc.dll" uint FirstWnd,FirstchildhWnd,handle string NULL SetNULL(NULL) FirsthWnd=FindWindowA(NULL,winName) if FirstWnd<>0 then FirstChildWnd=GetLastActivePopup(FirstWnd) handle=FindWindowA(NULL,"") if handle<>0 then SetWindowPos(handle,1,-1,-1,-1,-1,3) end if BringWindowToTop(FirsthWnd) if FirsthWnd<>FirstChildhWnd then BringWindowToTop(FirstChildhWnd) end if ShowWindow(FirsthWnd,3) return true end if return false  

給客戶端計算機傳送程序和消息

  1、給客戶端計算機傳送程序

  程序的及時更新,在系統運行之初是最令人頭痛的一個問題。如果程序員對程序進行任何一點的修改,都需要對每個用戶的程序進行更新。舉例來說,如果營業前台的程序進行了修改,那麼整個西安市的近二十多個營業廳就要全部跑一遍,人工地對各個營業廳的程序進行更新。同樣,如果測量台的程序修改了,全市大小幾十個測量台就都需要程序維護人員親自去對程序進行更新,對於各裝機公司和各程控機房亦是如此,並且在整個系統開通的初期,程序修改及其頻繁,幾乎每天都需要更新程序,最高峰的時期甚至到達一天就需要對程序更新好幾次。由此不難看出,這種情況下對於程序維護人員的壓力是可想而知的。面對這樣的困難,我們的解決之道是在Shell1.exe中加入了一個小技巧FTP Server。方法仍然類似於前面中文之星的啟動,直接在程序中run("Serve.exe")。正是這個FTP Server,所有的問題迎刃而解,維護人員只需要在網管中心通過遠程控制,就可以完成對程序的更新,而整個工作只需要用幾分鐘時間敲幾下鍵盤,維護人員再也不用為修改程序後無法及時向下發送而頭痛了。另外,如果熟練使用這個FTP Server,在網管中心就可以解決一些計算機的設置問題,從而使整個系統的各個計算機都能穩定正常地運行。譬如說,一次為了系統安全的考慮,系統管理員要求對系統用戶的口令進行修改,但當時系統正在運行,全市所有的營業廳、測量台、程控機房、裝機公司以及號線中心的二百多台微機都需要同時進行改動,否則就會出現大量計算機不能正確連接進入網絡的問題,而完成這個任務的時間只有利用中午一個半小時的空隙時間。不難想象,如果是由維護人員親自去各地方進行改動很難在這麼短的時間內把包括位於遠郊的各遠程點的計算機全部更新。但正是因為有了FTP Server這項技術革新,使得維護人員足不出戶就在一個半小時裡完成了二百多台微機的平穩更新。由此,在"九七系統"中加入FTP Server這項技術所產生的效益可窺之一斑。

  2、向用戶發布最新消息

  通過一些簡單的工作,就可以實現向用戶發布最新消息的功能,當然,消息的內容可以是多種多樣的,例如"九七系統"的使用知識、使用技巧、注意事項,關於電信業務的最新消息如市話初裝費優惠等都可以通過發布消息給用戶提示,總之所有想告訴用戶的內容都可以寫。具體實現如下: 建立一個表名為TUTORIAL,結構如下: DATE datetime TITLE char 30 CONTENT varchar 200 SCOPE varchar 20 ACTIVE char 1 在主窗口的open事件中加入如下代碼: string atical,content,sday,scope,active,str datetime day boolean dis=false DECLARE today CURSOR FOR SELECT DATE,TITLE,CONTENT,SCOPE FROM TUTORAL WHERE covert(char(12),DATE,3)=convert(char(12),getdate(),3) AND ACTIVE='1' ORDER BY DATE; OPEN today; FETCH today INTO :day,:article,:content,:scope; if sqlca.sqlcode=0 then dis=true end if sday=string(date(day)) str=sday+'~n~r'+content FETCH today INTO :day,:article,:content,:scope; Loop if dis=true then messagebox(article,str) end if   對於系統集成來說,用戶端界面的好壞,直接影響到用戶對系統的評價。以上介紹的技巧,都是針對"九七系統"中的特定問題摸索出的解決方法,但同時這些方法在其他系統集成中又不乏其普遍意義。  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved