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

圖1 自定義協議注冊內容
由于瀏覽器種類較多,常見瀏覽器內核分為IE內核和WebKit內核,采用自協議啟動應用助手時相應的環境監測及響應方式也不同。 IE內核瀏覽器,采用ActiveX方式進行注冊表信息檢測;Webkit內核瀏覽器,采用符合其瀏覽器特點的NPAPI插件進行檢測。因此,客戶端安裝應用助手的同時要給瀏覽器安裝插件。在web應用頁面中,不同瀏覽器檢測所支持的插件,無插件說明客戶端未安裝應用助手,彈窗提示安裝軟件;有插件說明客戶端已安裝應用助手,自定義協議啟動應用助手。web應用啟動應用助手流程如下:

圖2 web應用啟動應用助手
桌面程序啟動需要可執行文件.exe運行程序。應用助手啟動桌面程序的實現流程是:從本地數據庫中查詢客戶機是否有桌面程序的啟動資源,有則應用助手將桌面程序啟動;無則應用助手先從存放桌面程序的服務器上下荷啟動文件,并在客戶機本地數據庫中記錄桌面程序啟動路徑、進程名稱等信息,再將應用啟動。應用助手實現過程中,為防止服務器端桌面程序版本發生應更與用戶安裝信息不同步,還設計實施了更新信息推送功能。實施流程如圖所示:

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

圖5 應用助手中轉消息通訊流程圖
針對勝利油田業務應用系統之間孤立存在、業務功能無法通訊及業務協同應用難的問題,攻關研究了web應用與桌面程序之間啟動與通訊方法,實現了應用助手功能,建立了Web應用與桌面程序之間的橋梁,打通了Web應用與桌面程序之間啟動與通訊的環節,達到了業務功能之間全方位互聯互通的效有,為油田信息化整合奠定了基礎。