Delphi TWebBrowser和URL

Delphi TWebBrowser和URL,delphi,delphi-xe5,twebbrowser,Delphi,Delphi Xe5,Twebbrowser,我正在开发一个软件来验证将其从D5移植到XE5的问题。在D5中,每次用户单击所显示表单的提交按钮时,都会调用TWebBrowser.BeforeNavigate2。在XE5中,情况并非如此。我发现这是因为提交的URL包含http:/aDirectory/ExecToBeCall.exe。如果我添加一个额外的/after:事件为fire D5下的URL更改为: http://localhost/aDirectory/ExecToBeCall.exe(添加空格以断开文章中的链接) 在D5下的TWeb

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

D5下的URL更改为:

http://localhost/aDirectory/ExecToBeCall.exe
(添加空格以断开文章中的链接)

D5下的
TWebBrowser
无论如何都要触发并更改URL的行为对软件很重要,我不能将HTML(大约2000个文件)更改为包含2个。它让我们知道提交是在Delphi内部还是从外部浏览器进行的。我尝试了TWebBrowser的其他更新事件,但没有一个是fire

如何通知我有问题的URL,检查它并将其更改为本地主机URL?最好采用小而干净的方法


感谢您的帮助和建议

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

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

为什么XE5中的URL没有改变,我不知道。听起来像是在该版本的
TWebBrowser
中使用的任何版本的IE中出现的bug


在任何情况下,都是IE触发了事件,因此如果它不触发它不喜欢的URL,那么除了使用浏览器的DOM接口直接处理HTML webform的
onsubmit
事件之外,您无法做任何事情

如果你想重定向意外的url而不是导航到它,你可以从TEmbeddedWB项目开始,或者你可以用
IDocHostUIHandler
扩展
TWebBrowser
类来DIY,它有一个有趣的方法
TranslateURL

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;

谢谢你的帮助。看来问题毕竟来自于我们对文件的一些预处理。这是我发帖时不知道的。很明显,按照我所说的,不要再为IE 6或7工作了。