2014-10-10 64 views
2

我們公司正在將我們的幫助系統遷移到Flare下的HTML5格式。我們還在URI命令行上使用Flare CSHID's將基於主題的訪問權限添加到幫助系統中,以便直接訪問主題,例如index.html#CSHID = GettingStarted以啓動GettingStarted.html幫助頁面。對於本地html或文件URL,ShellExecute失敗

我們的應用程序使用C++編寫,並利用Win32 ShellExecute()函數生成與HTTP關聯的默認應用程序以顯示幫助系統。我們注意到ShellExecute()在沒有指定哈希標籤時工作正常,如

ShellExecute(NULL,_T(「open」),_ T(「c:\ Help \ index.html」),NULL,NULL ,SW_SHOWNORMAL);

此功能將啓動與查看HTML頁面相關的默認瀏覽器,在這種情況下,File:///協議處理程序將啓動,瀏覽器將啓動,您將看到file:/// c:/ Help /index.html在地址欄中。

然而,一旦你添加#信息主題,的ShellExecute()無法打開網頁

的ShellExecute(NULL,_T( 「開」),_ T(「C:\幫助\ index.html在#cshid = GettingStarted「),NULL,NULL,SW_SHOWNORMAL);

如果瀏覽器根本打開,那麼您將被定向到file:/// c:/Help/index.html,而沒有#cshid = GettingStarted主題標識。

請注意,如果通過ShellExecute()使用File協議處理程序,如果幫助系統停留在Web上,並且使用Http或Https協議處理程序,那麼這一切都很好。

對於我們的客戶,其中一些人在私人局域網中,我們不能總是依賴互聯網訪問,所以我們的幫助系統必須隨應用程序一起提供。

回答

2

經過微軟MSDN團隊的回顧,他們回顧了ShellExecute()調用的源代碼,並確定是的,當處理ShellExecute()中基於File:///的URL時,ShellExecute ()調用會在啓動默認瀏覽器併發送HTML頁面以打開之前剝離#和在#之後找到的任何數據。 MS的立場是他們故意避免注入功能。

解決的辦法是通過搜索URL的#來加強ShellExecute()調用,如果找到了一個,那麼我們將手動啓動帶有該URL的默認瀏覽器。這裏是僞代碼

void WebDrive_ShellExecute(LPCTSTR szURL) 
{ 
    if (_tcschr(szURL,_T('#'))) 
    { 
     // 
     //Get Default Browser from Registry, then launch it. 
     // 
     ::RegGetStr(HKCR,_T("HTTP\\Shell\\Open\\Command"),szBrowser); 
     ::CreateProcess (NULL, szBrowser + _T(" ") + szURL, NULL, NULL, FALSE, 0, NULL, NULL, &sui, &pi); 
    } 
    else 
     ShellExecute(NULL,_T("open"),szURL,NULL,NULL,SW_SHOWNORMAL); 
} 

授予了一些更多的C++代碼,但這種一般的設計對我們很有幫助。

相關問題