我正在开发一款软件来验证从 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网址?一个小而干净的方法会更好。
感谢您的帮助和建议
答案 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;