張靜*
(中國(guó)石化勝利油田分公司物探研究院,山東東營(yíng),257022)
勝利油田經(jīng)過(guò)多年的信息化建設(shè),研制開(kāi)發(fā)了上千套應(yīng)用系統(tǒng),這些應(yīng)用系統(tǒng)為保障油田生產(chǎn)、科研、經(jīng)營(yíng)管理做出了重大貢獻(xiàn),在節(jié)約成本、減少工作強(qiáng)度、規(guī)范業(yè)務(wù)流程等方面產(chǎn)生了巨大的社會(huì)效益和經(jīng)濟(jì)效益。然而,這些應(yīng)用系統(tǒng)有的是基于 B/S架構(gòu)開(kāi)發(fā)的,有的是基于C/S架構(gòu)開(kāi)發(fā)的,B/S與 C/S底層有構(gòu)不同,致使在Web應(yīng)用上無(wú)法直接調(diào)用桌面程序,操作缺乏靈活性。同時(shí),很多應(yīng)用系統(tǒng)的研發(fā)由各單位孤立完成,多套系統(tǒng)之間無(wú)法建立消息傳遞及事件響應(yīng)機(jī)制,信息不能數(shù)據(jù)共享和互通,給各部門(mén)、各單位、各專(zhuān)業(yè)應(yīng)用業(yè)務(wù)協(xié)同帶來(lái)了巨大的障礙。目前,勝利油田信息化建設(shè)工作正處于應(yīng)用系統(tǒng)集成整合階段,將在統(tǒng)一Web工作平臺(tái)上集成應(yīng)用所有油田業(yè)務(wù)功能的應(yīng)用系統(tǒng),并且相關(guān)聯(lián)的業(yè)務(wù)功能系統(tǒng)之間能夠互聯(lián)互通。為了達(dá)到這一目標(biāo),急需研究 Web應(yīng)用與桌面程序交互方法,解決 web應(yīng)用啟動(dòng)桌面程序和應(yīng)用之間消息通訊的問(wèn)題來(lái)創(chuàng)新信息化服務(wù)模式。
目前,通過(guò)網(wǎng)頁(yè)鏈接來(lái)打開(kāi)應(yīng)用程序客戶(hù)端的常用實(shí)現(xiàn)方式有兩種。第一種方式是以修改注冊(cè)表來(lái)作為打開(kāi)的方式,騰訊、迅雷和阿里旺旺就是通過(guò)這種方式實(shí)現(xiàn)的。其基本方法就是在安裝過(guò)程中或者是程序第一次啟動(dòng)時(shí)在注冊(cè)表中創(chuàng)建鍵項(xiàng)和鍵值,當(dāng)用戶(hù)點(diǎn)擊網(wǎng)頁(yè)上的鏈接或者直接通過(guò)瀏覽器輸入 tencent://或 Alitalk://這樣的 URL時(shí),這些輸入便全部作為命令行參數(shù)傳遞給客戶(hù)端程序,客戶(hù)端程序再對(duì)這些輸入進(jìn)行解析和響應(yīng)就能完成啟動(dòng)動(dòng)作。http://、 https://、ftp:// 是常用的協(xié)議,然而tencent:// 、Alitalk://或 thunder://這些 URL就是 QQ、阿里旺旺和迅雷自定義的協(xié)議,自定義協(xié)議是需要本地計(jì)算機(jī)安裝軟件與之接應(yīng)以便于實(shí)現(xiàn)相應(yīng)操作的,也就是當(dāng)你點(diǎn)擊帶有thunder://的URL連接時(shí),瀏覽器會(huì)利用機(jī)器系統(tǒng)來(lái)通知以何種程序處理該種協(xié)議的連接,這種對(duì)應(yīng)只能通過(guò)自定義注冊(cè)表信息來(lái)實(shí)現(xiàn)的;第二種方式需要使用apps(Asynchronous Pluggable Protocols,異步可插入?yún)f(xié)議,允許開(kāi)發(fā)者創(chuàng)建可插協(xié)議處理器、MIME過(guò)濾器,以及命名空間處理器工作在微軟瀏覽器中),這種方式只能按照apps設(shè)定的規(guī)則編寫(xiě)一個(gè) COM 組件來(lái)啟動(dòng)桌面程序,MSN就是通過(guò)這種方式實(shí)現(xiàn)的。在安裝MSN的過(guò)程中,應(yīng)用系統(tǒng)首先會(huì)先注冊(cè) dll并在注冊(cè)表注冊(cè)自定義協(xié)議scheme。當(dāng)注冊(cè)成功后,用戶(hù)在瀏覽器中輸入任何的以msnim://開(kāi)頭的URL請(qǐng)求都會(huì)通知到這個(gè)COM組件,再由DLL來(lái)處理桌面程序啟動(dòng)。相較而言,這兩種啟動(dòng)方式最終都能滿足 web應(yīng)用啟動(dòng)桌面程序的需求,要啟動(dòng)油田業(yè)務(wù)功能專(zhuān)業(yè)應(yīng)用程序必須制定自定義協(xié)議的方式進(jìn)行啟動(dòng),但就目前油田專(zhuān)業(yè)應(yīng)用程序多有化的狀況,只有兩種方式并存,才有利于適應(yīng)不同應(yīng)用系統(tǒng)的特殊性。
在Windows系統(tǒng)中,軟件間中的消息通訊猶如人身體中的神經(jīng)網(wǎng)絡(luò),起到連接各個(gè)模塊并相互發(fā)送指令、協(xié)調(diào)工作的的作用。同一臺(tái)機(jī)器的各個(gè)獨(dú)立進(jìn)程相互之間通訊的方式各式各樣,常用的有剪切板方法、郵槽方法、動(dòng)態(tài)數(shù)據(jù)交換(DDE)、文件映射、消息管道、WM_COPYDATA消息等方法,還可以通過(guò)socket套接字、配置文件和注冊(cè)表等來(lái)間接實(shí)現(xiàn)進(jìn)程間數(shù)據(jù)通訊任務(wù)。從數(shù)據(jù)交換量、硬件配置要求、程序響應(yīng)速度等方面來(lái)看,這幾種方法各存有不同的優(yōu)缺點(diǎn):用配置文件和注冊(cè)表的方法在基于業(yè)務(wù)功能的Web應(yīng)用與桌面程序進(jìn)程間進(jìn)行大數(shù)據(jù)量數(shù)據(jù)的快速交換問(wèn)題上是無(wú)法實(shí)現(xiàn)的;管道和socket套接字的使用需要有網(wǎng)卡的支持;動(dòng)態(tài)數(shù)據(jù)交換(DDE)通過(guò)維護(hù)全局分配內(nèi)存使的應(yīng)用程序間傳遞成為可能,其方式是在一塊全局內(nèi)存中手工放置大量的數(shù)據(jù),然后使用窗口消息傳遞內(nèi)存指針,這是16位WIN時(shí)代使用的方式,在WIN32下已經(jīng)沒(méi)有全局和局部?jī)?nèi)存了,現(xiàn)在的內(nèi)存只有一種就是虛存;WM_COPYDATA消息以消息緩沖區(qū)為中間介質(zhì),通信雙方的發(fā)送和接收操作均以消息為單位,在存儲(chǔ)器中,消息緩沖區(qū)被組織成隊(duì)列,消息隊(duì)列是獨(dú)立于生成它的進(jìn)程的一段存儲(chǔ)區(qū),任何具有正確訪問(wèn)權(quán)有的進(jìn)程都可以訪問(wèn)消息隊(duì)列,它非常適用于在進(jìn)程間交換消息,但要求接收端必須有一個(gè)可顯示的窗口,而恰好油田業(yè)務(wù)功能需要通訊的模塊是有界面的,有Form窗體的。綜合判斷,應(yīng)用之間通訊方式選擇WM_COPYDATA消息通訊機(jī)制即能獲得其窗口句柄,也就可以使用簡(jiǎn)單而方便的窗口消息WM_COPYDATA消息進(jìn)行消息傳遞,用來(lái)實(shí)現(xiàn)油田業(yè)務(wù)功能之間的互聯(lián)互通是最合適的方法。
經(jīng)過(guò) web應(yīng)用啟動(dòng)桌面程序方法研究,確定網(wǎng)頁(yè)鏈接啟動(dòng)桌面程序利用網(wǎng)絡(luò)協(xié)議完成。http這種通用協(xié)議不能啟動(dòng)油田業(yè)務(wù)特有的桌面程序,需要自定義網(wǎng)絡(luò)協(xié)議。自定義協(xié)議怎樣注冊(cè)到用戶(hù)的客戶(hù)機(jī)?另外,根據(jù)油田應(yīng)用集成整合需求,在一個(gè) web工作平臺(tái)怎樣啟動(dòng)多個(gè)桌面端業(yè)務(wù)程序?為了滿足這兩個(gè)方面的要求,需要開(kāi)發(fā)一個(gè)安裝在客戶(hù)端機(jī)器上的應(yīng)用助手程序。自定義協(xié)議隨著應(yīng)用助手的安裝注冊(cè)到用戶(hù)的客戶(hù)機(jī),自定義協(xié)議在web應(yīng)用上啟動(dòng)應(yīng)用助手程序,應(yīng)用助手程序再啟動(dòng)多個(gè)桌面程序。自定義協(xié)議 slkt://注冊(cè)內(nèi)容為:

圖1 自定義協(xié)議注冊(cè)內(nèi)容
由于瀏覽器種類(lèi)較多,常見(jiàn)瀏覽器內(nèi)核分為IE內(nèi)核和WebKit內(nèi)核,采用自協(xié)議啟動(dòng)應(yīng)用助手時(shí)相應(yīng)的環(huán)境監(jiān)測(cè)及響應(yīng)方式也不同。 IE內(nèi)核瀏覽器,采用ActiveX方式進(jìn)行注冊(cè)表信息檢測(cè);Webkit內(nèi)核瀏覽器,采用符合其瀏覽器特點(diǎn)的NPAPI插件進(jìn)行檢測(cè)。因此,客戶(hù)端安裝應(yīng)用助手的同時(shí)要給瀏覽器安裝插件。在web應(yīng)用頁(yè)面中,不同瀏覽器檢測(cè)所支持的插件,無(wú)插件說(shuō)明客戶(hù)端未安裝應(yīng)用助手,彈窗提示安裝軟件;有插件說(shuō)明客戶(hù)端已安裝應(yīng)用助手,自定義協(xié)議啟動(dòng)應(yīng)用助手。web應(yīng)用啟動(dòng)應(yīng)用助手流程如下:

圖2 web應(yīng)用啟動(dòng)應(yīng)用助手
桌面程序啟動(dòng)需要可執(zhí)行文件.exe運(yùn)行程序。應(yīng)用助手啟動(dòng)桌面程序的實(shí)現(xiàn)流程是:從本地?cái)?shù)據(jù)庫(kù)中查詢(xún)客戶(hù)機(jī)是否有桌面程序的啟動(dòng)資源,有則應(yīng)用助手將桌面程序啟動(dòng);無(wú)則應(yīng)用助手先從存放桌面程序的服務(wù)器上下荷啟動(dòng)文件,并在客戶(hù)機(jī)本地?cái)?shù)據(jù)庫(kù)中記錄桌面程序啟動(dòng)路徑、進(jìn)程名稱(chēng)等信息,再將應(yīng)用啟動(dòng)。應(yīng)用助手實(shí)現(xiàn)過(guò)程中,為防止服務(wù)器端桌面程序版本發(fā)生應(yīng)更與用戶(hù)安裝信息不同步,還設(shè)計(jì)實(shí)施了更新信息推送功能。實(shí)施流程如圖所示:

圖3 應(yīng)用助手啟動(dòng)桌面程序
通過(guò)對(duì)進(jìn)程間通訊技術(shù)的研究,設(shè)計(jì)了訂閱/發(fā)布式的進(jìn)程內(nèi)通訊方式,采用了使用Windows的WM_COPYDATA消息來(lái)進(jìn)行消息傳遞。并且將兩種通訊方式進(jìn)行了封裝,以類(lèi)庫(kù)的方式提供給系統(tǒng)中所有的模塊使用。而勘探助手作為中轉(zhuǎn),分析發(fā)布消息內(nèi)容,獲取目標(biāo)應(yīng)用信息,通過(guò)目標(biāo)應(yīng)用信息判斷執(zhí)行動(dòng)作。應(yīng)用程序接收到消息后,根據(jù)既定的消息格式,分解消息內(nèi)容并執(zhí)行。
ECFMessage消息類(lèi):所有的消息通訊實(shí)際上是數(shù)據(jù)的傳遞,設(shè)計(jì)ECFMessage類(lèi),該類(lèi)包含string類(lèi)型字段“類(lèi)型名稱(chēng)”,string類(lèi)型“命令”,SerializableDictionary
WindowsAPI:該類(lèi)封裝了進(jìn)程間通訊時(shí)需要調(diào)用的Windwos API,包括 EnumWindows、FindWindow、FindWindowEx、GetWindowText、SendMessage 等WindowsAPI方法。
事件管理工廠 GeneralEventManager:該類(lèi)對(duì)外提供良好的數(shù)據(jù)接口,包含了對(duì)外暴露的方法BroadcastMessage、BroadcastMessageExcept、PublishMessage、Register,在內(nèi)部,通過(guò)判斷客戶(hù)端傳遞的參數(shù),判斷提供進(jìn)程間通訊的Win32CopyDataECFPushProvider實(shí)例,還是用于進(jìn)程內(nèi)通訊的IocEventECFPushProvider實(shí)例。
程序集對(duì)外接口GeneralECFClient:GeneralECFClient是消息通訊組件對(duì)外暴露的唯一接口,它是對(duì)GeneralEventManager的進(jìn)一步封裝,在該接口中同樣提供 了 BroadcastMessage、BroadcastMessageExcept、PublishMessage、Register等方法。外部程序通過(guò)實(shí)例化該類(lèi),即可將自己的消息注冊(cè)到消息池,消息池通過(guò)發(fā)布或者廣播的方式將消息轉(zhuǎn)發(fā)給需要交互的模塊或進(jìn)程。
消息發(fā)送是通過(guò)GeneralECFClient類(lèi)完成,消息的發(fā)布通過(guò)BroadcastMessageExcept方法以廣播的方式將攜帶數(shù)據(jù)的消息發(fā)送到所有Windows窗口句柄。
應(yīng)用助手接收到消息后,分析消息內(nèi)容,消息的內(nèi)容有標(biāo)準(zhǔn)格式,方便消息內(nèi)容的解析。消息標(biāo)識(shí):通信標(biāo)識(shí)、動(dòng)作類(lèi)型等信息;應(yīng)用信息:應(yīng)用名稱(chēng)、啟動(dòng)文件等信息;用戶(hù)信息:用戶(hù)名、用戶(hù)單位等信息;模塊信息:模塊標(biāo)識(shí)、模塊名稱(chēng)、啟動(dòng)信息、模塊參數(shù)等。
消息接收方通過(guò)重荷Form窗體的DefWndPro方法,實(shí)現(xiàn)在Form上截取消息,做相應(yīng)處理。應(yīng)用助手中轉(zhuǎn)消息通訊流程圖如下所示:

圖5 應(yīng)用助手中轉(zhuǎn)消息通訊流程圖
針對(duì)勝利油田業(yè)務(wù)應(yīng)用系統(tǒng)之間孤立存在、業(yè)務(wù)功能無(wú)法通訊及業(yè)務(wù)協(xié)同應(yīng)用難的問(wèn)題,攻關(guān)研究了web應(yīng)用與桌面程序之間啟動(dòng)與通訊方法,實(shí)現(xiàn)了應(yīng)用助手功能,建立了Web應(yīng)用與桌面程序之間的橋梁,打通了Web應(yīng)用與桌面程序之間啟動(dòng)與通訊的環(huán)節(jié),達(dá)到了業(yè)務(wù)功能之間全方位互聯(lián)互通的效有,為油田信息化整合奠定了基礎(chǔ)。