當前位置:
首頁 > 知識 > 從網頁Web上調用本地應用程序(.jar、.exe)的主流處理方法

從網頁Web上調用本地應用程序(.jar、.exe)的主流處理方法

在做web應用的時候,我們經常會遇到在web中調用本地應用程序的問題,例如在web中點擊一個按鈕,然後打開自己寫的或者別人的應用程序。上網比較留意的同學應該會發現,想qq客服,淘寶的阿里旺旺客服都會有這樣的效果。

其中qq的聊天按鈕已經開源,你也可以寫到自己的網頁中,詳見http://wp.qq.com/index.html。

下面我主要介紹一種現在主流的處理方法,這種方法在網上的其他地方也有,但是都是轉來轉去,而且寫得不詳細,對於初學者來說,很難看懂,並仿照著處理。所以這篇文章不算原創,只能說是對網上的文章進行詳細說明,便於大家使用和仿照。

自己在做《電能計量模擬實訓系統》中,需要在B/S系統中調用C/S模擬系統,並傳入幾個參數,嘗試著用js調用activeObject來處理,但是這個涉及到安全性的問題,而且只能在ie下才能實現。

備註:這個項目是用Java完成的,包括c/s部分也是用Javaswing做的,所以我遇到的問題是在web上調用java打包之後jar應用程序,難度比web調用exe多了一步工作。

這個方法主要思路是利用自定義URL Protocol來調用應用程序。瀏覽器在解析到自定義URL Protocol之後,會尋找註冊表,然後通過註冊表啟動相應的程序,然後啟動改程序,傳入參數。對於我這個項目而言,主要思路是利用這個自定義URL Protocol的方法,打開一個c#的應用程序,在這個程序中再調用系統命令,打開jar應用程序,並傳入參數。主要實現步驟如下:

1.添加自定義URL Protocol

[plain] view plain copy

  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOTSimu]
  3. "URL Protocol"="x:\simu\Simulink.exe"
  4. @="SimuProtocol"
  5. [HKEY_CLASSES_ROOTSimuDefaultIcon]
  6. @="x:\simu\Simulink.exe,1"
  7. [HKEY_CLASSES_ROOTSimushell]
  8. [HKEY_CLASSES_ROOTSimushellopen]
  9. [HKEY_CLASSES_ROOTSimushellopencommand]
  10. @=""x:\simu\Simulink.exe" "%1""

在#內的為自定義URL Protocol的註冊表信息,我對每一行說明一下:第一行是註冊表工具的版本信息,可以自己改一改,或者自己導入任意一個註冊信息,把這一行複製過來就行了;第二行中的Simu就是在HKEY_CLASSES_ROOT下面添加一個Simu樹,其中Simu的名稱就對應著自定義URL Protocol的名稱,在web中調用的時候需要這個名稱;第三行中的"x:\simu\Simulink.exe"是指定應用程序的路徑,注意只能是exe的程序;第四行是協議的名稱,可以是任意字元串,後面不會用到;第五行表示在Simu中再加一個分支,照抄,不用管;第六行中的x:\simu\Simulink.exe也是對應的程序路徑,後面的1照抄;第七行同第五行;第八行同第五行;第九行同第五行;第十行也是將路徑換成自己的程序路徑即可,其中%1表示到參數,參數可以在你的程序simulink.exe中解析得到。分析畢。

將#之間的內容複製到一個txt文檔中,修改後綴名為.reg,雙擊該文件即可直接導入到註冊表中。如下圖:

從網頁Web上調用本地應用程序(.jar、.exe)的主流處理方法

2.編寫C#程序(simulink.exe)調用Jar應用程序

simulink.exe程序就是上述註冊表中指定的程序,即web上點擊按鈕之後,啟動的程序。

考慮到程序配置的簡易和後期維護的方便,將jar程序的路徑放到環境變數中,key對應為EMES_Simu,value對應為simulink.jar程序的絕對路徑。

由此可得,對於simulink.exe的主要任務就是:

main(string[] args) {

/**程序流程如下:

*第一步:分析windows系統中的環境變數,得到環境變數為EMES_Simu的值(這個值是windows系統中Simulink.jar文件的絕對路徑)。設為String pathValue;

*第二步:構造調用simulink.jar文件的系統命令。大致結構是:String cmdString,=「java -jar」+ pathValue + args[0] + " " + args[1] + " " args[2] + " " args[3] + " " args[4] + " " args[5];

*第三步:調用系統命令cmdString,執行Java應用程序,本程序主界面隱藏或者退出(只要不影響java應用程序的運行即可,並且java程序退出之後c#程序必須要退出)

**/

}

大家可能會思考這些功能用C語言即可完成,何必用c#的gui程序,這是因為c語言的控制台程序運行系統命令之後,控制台的黑屏會一直保留,即使你想盡辦法讓它最小化,隱藏或者退出,在啟動的時候也會有一個黑屏一閃而過,極不美觀,使用c#的gui程序,讓程序的界面一直隱藏而不顯示,就不會有這種一閃而過的感覺了。(當然你也可以用其他的語言或者其他方法處理了,這一點不限制)

3.在web中調用自定義協議啟動程序

調用協議很簡單,就是一個鏈接即可,如下所示:

<a href="Simu://hello">SIMU</a>

需要指出的是:在標題1中的第10行註冊表中代碼中的%1表示傳入參數,就是對應這此處的Simu://hello,解析之後就可以得到參數hello了。

效果如下圖所示:

(1)web頁面

從網頁Web上調用本地應用程序(.jar、.exe)的主流處理方法

(2)點擊之後

從網頁Web上調用本地應用程序(.jar、.exe)的主流處理方法

(3)點擊啟動程序

從網頁Web上調用本地應用程序(.jar、.exe)的主流處理方法

圖中可以看到後面的黑屏就是c程序調用系統命令的界面,登陸界面就是自己的java swing程序。調用成功!

4.還存在的問題

(1)路徑問題

利用這種方法,還存在一個問題,這個問題在標題3(3)中的圖片就可以看到,在後面的黑屏中有報錯,這是因為路徑問題造成的。在程序中,引用資源等都習慣使用相對路徑,在web中調用c#程序之後,c#中的相對路徑就是瀏覽器所在的路徑,在c#中調用系統命令之後,在java程序中的相對路徑就是c#程序的路徑了!

對於這個問題的解決方法:(a)使用絕對路徑,所謂絕對路徑簡單的說就是帶盤符的路徑。(b)解析路徑,在生成的相對路徑中解析出程序真正需要的路徑。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Django自定義管理器
Spark SQL與DataFrame詳解以及使用

TAG:程序員小新人學習 |