首次接到“利用網頁打開本地exe文件”這個任務時,還真有點摸不着頭腦,后來細想,在淘寶上點擊賣家的旺旺能開啟本地的旺旺,這不就是利用的網頁打開本地exe文件嗎?
了解這種實實在在存在的合理需求后,開始調查。經過網上搜索查詢,主要歸納為兩種實現方式,方式一:利用JS打開本地exe文件。一般瀏覽器,由於安全問題,都會禁止掉這個特性,這就導致部分瀏覽器不支持該種方式。方式二:利用瀏覽器外部協議(URL Procotol)打開本地exe文件。用這種方式實現,任何瀏覽器都兼容。在實際開發中,當然首選方式二。
一、利用注冊表文件將外部協議寫入注冊表
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\PCTV] @="PCTVProtocol" "URL Protocol"="\"C:\\Program Files (x86)\\PCTV雙模軟終端_64位\\PCTV.exe\"" [HKEY_CLASSES_ROOT\PCTV\DefaultIcon] @="\"C:\\Program Files (x86)\\PCTV雙模軟終端_64位\\PCTV.exe,1\"" [HKEY_CLASSES_ROOT\PCTV\shell] [HKEY_CLASSES_ROOT\PCTV\shell\open] [HKEY_CLASSES_ROOT\PCTV\shell\open\command] @="\"C:\\Program Files (x86)\\PCTV雙模軟終端_64位\\PCTV.exe\" \"%1\""
將以上代碼存入reg文件中,雙擊文件執行即可。在瀏覽器中輸入“pctv://”或“pctv://param1,param2”,執行后即可打開對應路徑下的exe文件。
二、 在安裝exe文件時將外部協議寫入注冊表
在實際部署中,不會讓客戶安裝完程序再手動單擊注冊表文件將安裝路徑寫入注冊表,最容易讓人接受的方式就是在安裝exe文件時將安裝路徑寫入注冊表。利用Inno Setup打包exe文件時,在腳本中加入如下代碼即可:
[Registry] Root:HKCR;Subkey:"PCTV";ValueType:string;ValueName:"URL Protocol";ValueData:"{app}\{#MyAppExeName}";Flags:createvalueifdoesntexist uninsdeletekey Root:HKCR;Subkey:"PCTV\DefaultIcon";ValueType:string;ValueData:"{app}\{#MyAppExeName}";Flags:createvalueifdoesntexist uninsdeletekey Root:HKCR;Subkey:"PCTV\shell";Flags:createvalueifdoesntexist uninsdeletekey Root:HKCR;Subkey:"PCTV\shell\open";Flags:createvalueifdoesntexist uninsdeletekey Root:HKCR;Subkey:"PCTV\shell\open\command";ValueType:string;ValueData:"{app}\{#MyAppExeName} ""%1""";Flags:createvalueifdoesntexist uninsdeletekey
這樣,在瀏覽器中輸入“pctv://”或“pctv://param1,param2”,執行后即可打開對應路徑下的exe文件。
以上兩種寫入注冊的方式,允許在外部協議中帶參數。
三、遇到的問題
在利用外部協議打開本地exe文件時,通過查看日志記錄,看到會出現路徑不對的問題。通過查看代碼在程序中用Environment.CurrentDirectory獲取可執行文件的路徑,但是通過瀏覽器打開exe文件時,Environment.CurrentDirectory獲取的是瀏覽器exe文件的路徑,這樣在程序中就會報錯。解決方法是將Environment.CurrentDirectory修改為Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)即可。