2014-03-05 69 views
1

我正在研究一個軟件來驗證將它從D5移植到XE5的問題。每次用戶點擊顯示錶單的提交按鈕時,都會調用D5TWebBrowser.BeforeNavigate2。在XE5中,情況並非如此。我發現這是因爲提交的URL包含http:/aDirectory/ExecToBeCall.exe。如果我添加一個/之後:事件發生。TWebBrowser和URL

在D5的URL是變化爲:

http ://localhost/aDirectory/ExecToBeCall.exe(空間添加到打破後鏈接)

下D5TWebBrowser這種行爲無論如何火災並更改網址是很重要該軟件和我不能將HTML(約2000個文件)更改爲包含2.它允許我們知道提交是在Delphi內還是從外部瀏覽器進行的。我嘗試了其他更新的TWebBrowser事件,沒有一個是火的。

如何獲知有問題的URL,檢查並將其更改爲本地主機URL?一個小而乾淨的方法將是更可取的。

感謝您的幫助和建議

回答

0

TWebBrowser就位於Internet Explorer的ActiveX對象的簡單封裝,因此它是IE瀏覽器本身,而不是TWebBrowser,即表現不同。

http:/aDirectory/ExecToBeCall.exe實際上是一個有效的URL。由於:後面沒有//,因此URL中沒有授權部分,因此沒有明確的主機名。 localhost用作隱式主機名,路徑爲/aDirectory/ExecToBeCall.exe。這就是在D5中將URL改爲正確的行爲。將URL更改爲http://aDirectory/ExecToBeCall.exe不正確,因爲這會創建URL的權威部分,因此主機名顯式設置爲aDirectory,路徑設置爲/ExecToBeCall.exe,這不是您想要的。

爲什麼URL在XE5中沒有改變,我不知道。聽起來像是在該版本的TWebBrowser中使用的任何版本的IE中的錯誤。

在任何情況下,它都是觸發事件的IE,所以如果它沒有觸發一個它不喜歡的URL,那麼就沒有辦法做到這一點,因爲使用瀏覽器的DOM接口來處理直接使用HTML網絡表格的事件。

+0

感謝您的幫助。看起來畢竟這個問題來自我們所做的一些文件預處理。在我的帖子發佈時我並不知道。顯然,一個/停止圍繞IE 6或7從我所告訴的工作。 – PForest

0

如果要重定向而不是引導到這個意想不到的網址,你可以用TEmbeddedWB項目啓動,也可以通過擴展TWebBrowserIDocHostUIHandler,它有一個有趣的方法TranslateURL DIY。

function TAdvWebBrowser.TranslateURL(const dwTranslate: DWORD; const pchURLIn: POLESTR; var ppchURLOut: POLESTR): HRESULT; 
var 
    Url: string; 
    BufferSize: Integer; 
begin 
    Url := PChar(pchURLIn); 
    if GetSafeUrlFor(Url) then 
    begin 
    ppchURLOut := CoTaskMemAlloc(BufferSize); 
    CopyMemory(ppchURLOut, PChar(Url), BufferSize); 

    // redirects to new location 
    Result := S_OK; 
    end 
    else 
    // no redirection 
    Result := S_FALSE; 
end; 

// You can change the function to add more complex redirection rules 
function GetSafeUrlFor(var Url: string): Boolean; 
begin 
    Result := Url.EndsWithText('.exe'); 
    if Result then 
    Url := 'http://localhost/'; 
end;