【问题标题】:TWebBrowser and URLTWebBrowser 和 URL
【发布时间】:2014-03-05 15:32:31
【问题描述】:

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

在 D5 下,URL 更改为:

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

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

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

感谢您的帮助和建议

【问题讨论】:

    标签: delphi delphi-xe5 twebbrowser


    【解决方案1】:

    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,这不是您想要的。

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

    无论如何,触发事件的是 IE,所以如果它没有触发它不喜欢的 URL,那么除了使用浏览器的 DOM 接口来处理 @ 987654332@ HTML 网络表单的直接事件。

    【讨论】:

    • 感谢您的帮助。毕竟问题似乎来自我们对文件进行的一些预处理。我在发帖时并不知道这一点。据我所知,显然是/停止在 IE 6 或 7 周围工作。
    【解决方案2】:

    如果你想重定向意外的 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;
    

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2020-03-23
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多