TWebBrowser和URL

时间:2014-03-05 15:32:31

标签: delphi delphi-xe5 twebbrowser

我正在开发一款软件来验证从 D5 移植到 XE5 的问题。在 D5 中,每次用户点击所显示表单的提交按钮时都会调用TWebBrowser.BeforeNavigate2。在XE5中,情况并非如此。我发现这是因为提交的网址包含http:/aDirectory/ExecToBeCall.exe。如果我添加额外/之后:事件是火。

在D5下,URL更改为:

http ://localhost/aDirectory/ExecToBeCall.exe(添加空格以打破帖子中的链接)

D5 TWebBrowser的行为无论如何要点击并更改网址对于软件很重要,我无法更改 HTML (约2000个文件)包含2.它允许我们知道提交是在Delphi内部还是在外部浏览器中进行的。我尝试了TWebBrowser的其他和更新的事件,没有一个是火。

如何通知有问题的网址,检查并将其更改为localhost网址?一个小而干净的方法会更好。

感谢您的帮助和建议

2 个答案:

答案 0 :(得分:0)

TWebBrowser只是Internet Explorer的ActiveX对象的一个​​薄包装器,因此IE本身而不是TWebBrowser的行为方式不同。

http:/aDirectory/ExecToBeCall.exe实际上是一个有效的网址。由于:后面没有//,因此URL中没有权限部分,因此没有明确的主机名。 localhost用作隐式主机名,路径为/aDirectory/ExecToBeCall.exe。这就是在D5中将URL更改为的内容,这是正确的行为。将URL更改为http://aDirectory/ExecToBeCall.exe是不正确的,因为这会创建URL的权限部分,因此主机名显式设置为aDirectory,路径设置为/ExecToBeCall.exe,这不是什么你要。

为什么URL在XE5中没有变化,我不知道。听起来像TWebBrowser版本中使用的任何IE版本的错误。

在任何情况下,触发事件的是IE,所以如果它没有触发它不喜欢的URL,那么除了使用浏览器的DOM接口来处理{之外,没有什么可以做的。 {1}} HTML webform直接发生的事件。

答案 1 :(得分:0)

如果你想重定向意外网址而不是导航到它,你可以从TEmbeddedWB项目开始,或者你可以通过TWebBrowser课程IDocHostUIHandler来扩展,其中TranslateURL有一个有趣的方法{{1} }。

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;