在網頁如何呼叫客戶端的可執行檔案

傑克.陳發表於2017-12-03
原文:在網頁如何呼叫客戶端的可執行檔案

在網頁如何呼叫客戶端的可執行檔案

最近,群裡在討論如何從網頁中開啟一個exe檔案。在群裡面說了下思路,但總說不清楚,答應寫一篇文章出來。這幾天事情挺多,一直沒時間寫,讓阿超同學久等了。

基於瀏覽器的應用,表現力始終不夠豐富,我們常常會想,在一個網頁中,點一下某個連結,能夠直接呼叫安裝好的可執行程式有多好啊。按照微軟的推薦,應該是通過ActiveX,把可執行程式嵌入到網頁中,例如flash的ActiveX。這樣,我們就要購買ActiveX的簽名,不通過簽名的東西,在IE6中是無法載入的,為一個小專案購買ActiveX的簽名,代價太昂貴了。另外,很多時候還要考慮如果使用者突然關閉了瀏覽器該怎麼辦。這對播放個flash、歌曲之類的沒多大影響,但是很多時候,不能在關閉前清掃戰場,帶來的後果是災難性的。通常,在企業應用中,我們總是通過IE直接呼叫exe。
最早的時候,從網頁呼叫一個EXE是很簡單的事情,一段javascript就可以了。但是,自從IE6開始,微軟就不再允許這種“極不安全的行為”。這也是有道理的。沒事就給你來個“format d:/q”,即使不這麼惡劣,動不動就給你彈幾百個notebook,也確實夠恐怖的。瀏覽器不應該與作業系統有太多不必要的關聯。
拿javascript在IE6測試之後,我幾乎放棄了直接呼叫exe的想法,直到有一天,看到了騰訊的實現方法。
騰訊有一個在網頁上面顯示QQ狀態的東西,點一下就能彈出一個對話方塊跟該QQ使用者聊天,而不會有任何警告。好神奇啊。登錄檔裡面研究了一天,終於明白了怎麼回事。

在windows中,登錄檔中包含各種協議(http,ftp,telnet等)的資訊,包含了預設開啟方式的引數。試一下,從IE的位址列中輸入telnet://www.163.com,出現什麼了?彈出了一個命令列視窗,開始進行telnet操作。IE居然能完成這個,那麼為什麼就不能完成“telnet1://引數” 呢?

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE/SOFTWARE/Classes/SIMS]
@=”SIMS”
“URL Protocol”=”C://PROGRA~1//SIMS//trans.exe %l”

[HKEY_LOCAL_MACHINE/SOFTWARE/Classes/SIMS/DefaultIcon]
@=”%SystemRoot%//system32//url.dll,0″

[HKEY_LOCAL_MACHINE/SOFTWARE/Classes/SIMS/Shell]

[HKEY_LOCAL_MACHINE/SOFTWARE/Classes/SIMS/Shell/open]

[HKEY_LOCAL_MACHINE/SOFTWARE/Classes/SIMS/Shell/open/command]
@=”C://PROGRA~1//SIMS//trans.exe %l”

把這個東西匯入登錄檔,那麼我們在瀏覽器中輸入sims://1022,那麼就會自動呼叫c:/program files/sims/trans.exe(當然了,你得確實有這個檔案),並把1022這個引數傳給該exe。這個操作被認為是安全的,不會有任何的限制。
到這裡,思路就清晰了,我們的安裝程式中,在登錄檔中建個協議,例如上面的SIMS,再把要執行的exe的路徑資訊寫入,在網頁直接一個超連結,協議://引數就可以了。exe檔案接受這個引數,進行相應的處理。搞定。

記住,協議://後面的所有字串被看做是一個引數。那麼,exe檔案永遠只有兩個引數,引數0是它的完整執行路徑,引數1就是網頁傳過來的字串


相關文章