一、web調用本地應用程序的思路
這個方法主要思路是利用自定義URL PRotocol來調用應用程序。瀏覽器在解析到自定義URL Protocol之后,會尋找注冊表,然后通過注冊表啟動相應的程序,然后啟動改程序,傳入參數。這樣就可以在WEB頁面調到你的程序了。比如在瀏覽器地址欄輸入“tencent://message/?uin=88888888&Site=JooIT.com&Menu=yes”就會出現一個QQ對話框。
1、先往注冊表寫信息。如下:
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT/Diff]"URL Protocol"="這里是小程序的安裝路徑"@="DiffProtocol"[HKEY_CLASSES_ROOT/Diff/DefaultIcon]@="這里是小程序的安裝路徑,1"[HKEY_CLASSES_ROOT/Diff/shell][HKEY_CLASSES_ROOT/Diff/shell/open][HKEY_CLASSES_ROOT/Diff/shell/open/command]@="/"這里是小程序的安裝路徑/" /"%1/""將上面的內容保存為.reg文件運行即可。
2、web頁面調用。在網頁直接一個超鏈接,協議://參數就可以了。比如
<a href=" Diff://"> alt="點擊這里"> </a>
<a href=" Diff://hello">SIMU</a>需要指出的是:在上面例子中注冊表中代碼【@="/"這里是小程序的安裝路徑/" /"%1/""】中的%1表示傳入參數,就是對應這此處的Diff://hello,解析之后就可以得到參數hello了。
二、完整實例。
1、xxxClient.reg文件
Windows RegistryEditor Version 5.00 [HKEY_CLASSES_ROOT/xxxClient]@="xxxClientProtocol""URLProtocol"="" [HKEY_CLASSES_ROOT/xxxClient/DefaultIcon]@="C:// xxx_Client//client.bat,1" [HKEY_CLASSES_ROOT/xxxClient/shell] [HKEY_CLASSES_ROOT/xxxClient/shell/open] [HKEY_CLASSES_ROOT/xxxClient/shell/open/command]@="/"C://xxx_Client//client.bat/" /"%1/""2、client.bat文件
@echo off rem設置當前目錄為C:/ xxx _Client/setcurrent_dir=C:/ xxx _Client/ pushd%current_dir% call C:/ xxx _Client/xxx _Client.exe3、web頁面文件
<!DOCTYPEHTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type"content="text/html; charset=utf-8" /> </head> <body> <div> <a href="xxxClient://"> 打開客戶端軟件 </a> </div> </body></html>三、注意問題:
1、如何動態生成注冊表信息,可以在應用程序中寫代碼操作注冊表,寫入上面的URL Protocol注冊表格式信息。
2、路徑問題,如果應用程序包含了很多文件,就涉及到工作路徑問題,web調用應用程序,當時的工作路徑是的web運行的工作路徑??梢酝ㄟ^bat或應用程序來切換路徑。
以bat為例,建立一個批處理文件,里面切換路徑,注冊注冊表信息時,[HKEY_CLASSES_ROOT/Diff/shell/open/command]使用bat路徑。
xxxClient.bat文件
@echo off
rem設置當前目錄為C:/ xxx_Client/
setcurrent_dir=C:/ xxx_Client/
pushd%current_dir%
call C:/ xxx_Client/xxx_Client.exe
3、如何獲取參數?
MFC Dialog程序的參數值:
首先需要獲取傳入的參數,在控制臺程序中我們都知道main()函數的參數argv里帶入了傳入的參數,而在MFC程序中則需要在InitInstance()中進行命令行參數解析。
CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo);
為了給對話框傳入待顯示的參數,加入了一個SetDisplayInfo方法。
CHelloWorldDlg dlg; dlg.SetDisplayInfo(cmdInfo.m_strFileName);//設置待顯示的信息
void CHelloWorldDlg::SetDisplayInfo(CString& strInfo){ this->m_strInfo = strInfo;}
最后在OnInitDialog函數中進行參數解析
//解析傳入的完整地址,e.g "helloworld://hello world/" int pos = m_strInfo.Find("//");//找到分隔符 m_strInfo = m_strInfo.Mid(pos+2);//取到傳入的參數 m_strInfo.Delete(m_strInfo.GetLength()-1);//去掉最后的'/' m_edit_info.SetWindowText(m_strInfo);
代碼實例
參考資料:
1, Registering an application to a URL Protocol
新聞熱點
疑難解答