在網頁如何調用客戶端的可執行文件
最近,群里在討論如何從網頁中打開一個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就是網頁傳過來的字符串