【问题标题】:How to always load a fresh page in TWebBrowser?如何始终在 TWebBrowser 中加载新页面?
【发布时间】:2015-02-10 19:46:28
【问题描述】:

我正在尝试使用 Browser.Navigate(URL) 将网页加载到 TWebBrowser。但是,浏览器不会关心页面是否在线更新,所以只要我不重新启动程序它就不会显示新页面。

一个更具体的例子: 如果我导航到具有访问者计数器(如图像)的网页,计数器将增加。如果我离开该页面然后返回(不使用返回),计数器将不会增加。在 Firefox 中,它确实会增加。

这是我尝试过的,但不起作用:

const
  DLCTL_PRAGMA_NO_CACHE = $00004000;

procedure TBrowserFrm.LoadURL(URL: string);
var
  Flag: OleVariant;
begin
  Flag:=DLCTL_PRAGMA_NO_CACHE;
  Browser.Navigate(URL, Flag);
end; 


procedure TBrowserFrm.LoadURL(URL: string);
var
Flags: OleVariant;
begin
 Flags := 'navNoHistory, navNoReadFromCache, navNoWriteToCache';
 Browser.navigate2(URL, Flags);
end;

关于如何让 TWebBrowser 加载真实页面的任何想法?

【问题讨论】:

  • 我可以在 Navigate 之后调用 Refresh 但这会有点过头了。

标签: delphi twebbrowser


【解决方案1】:

在 VCL 中,TWebBrowser 是 Internet Explorer 的包装器,特别是 IWebBrowser2 接口。

DLCTL_PRAGMA_NO_CACHE不是可以传递给Navigate2() 的标志。阅读文档:

SHDocVw.TWebBrowser

TWebBrowser 封装了来自 Microsoft 的 Shell Doc 对象和控制库 (SHDOCVW.DLL) 的 IWebBrowser2 接口,允许您创建自定义的 Web 浏览应用程序或将 Internet、文件和网络浏览、文档查看和数据下载功能添加到您的应用程序。

IWebBrowser2::Navigate2 Method

Flags [in] 指向 VT_I4 或 VT_I2 类型的 VARIANT 的指针,它指定由 BrowserNavConstants 枚举定义的值的组合。

BrowserNavConstants Enumerated Type

typedef enum BrowserNavConstants {
    navOpenInNewWindow = 0x1,
    navNoHistory = 0x2,
    navNoReadFromCache = 0x4,
    navNoWriteToCache = 0x8,
    navAllowAutosearch = 0x10,
    navBrowserBar = 0x20,
    navHyperlink = 0x40,
    navEnforceRestricted = 0x80,
    navNewWindowsManaged = 0x0100,
    navUntrustedForDownload = 0x0200,
    navTrustedForActiveX = 0x0400,
    navOpenInNewTab = 0x0800,
    navOpenInBackgroundTab = 0x1000,
    navKeepWordWheelText = 0x2000,
    navVirtualTab = 0x4000,
    navBlockRedirectsXDomain = 0x8000,
    navOpenNewForegroundTab = 0x10000
} BrowserNavConstants;

如您所见,DLCTL_PRAGMA_NO_CACHE 不在该列表中。它实际上是您在为浏览器的DISPID_AMBIENT_DLCONTROL 属性实现处理程序时指定为输出值的标志。阅读 MSDN 文档:

WebBrowser Customization | Controlling Download and Execution

WebBrowser 控件让您可以控制它下载、显示和执行的内容。要获得这种控制,您需要实现主机的 IDispatch,以便它处理 DISPID_AMBIENT_DLCONTROL。当 WebBrowser 控件被实例化时,它将使用此 ID 调用您的 IDispatch::Invoke。使用按位 OR 运算符将 pvarResult 设置为以下标志的组合,以表明您的偏好。
...
• DLCTL_RESYNCHRONIZE 和 DLCTL_PRAGMA_NO_CACHE:这些标志会导致缓存刷新。使用 DLCTL_RESYNCHRONIZE,将要求服务器提供更新状态。如果服务器指示缓存信息是最新的,则将使用缓存文件。使用 DLCTL_PRAGMA_NO_CACHE,无论文件的更新状态如何,都将从服务器重新下载文件。
...

因此,您必须实现自定义 IDispatch 对象并将其挂钩到 IWebBrowser2 才能正确使用 DLCTL_PRAGMA_NO_CACHE

或者,您可以考虑切换到 TEmbeddedWB,它会为您处理浏览器自定义,并具有一个接受 DLCTL... 标志的 DownloadOptions 属性,包括 DLCTL_PRAGMA_NO_CACHE

【讨论】:

    【解决方案2】:

    我想你必须使用 4,而不是 $00004000。

    由于我使用 www.ghisler.com(计数器在底部)我可以使用

    procedure TForm2.Button2Click(Sender: TObject);
    var
      Flags: OLEVariant;
    
    begin
      Flags:=4; //NavNoReadFromCache
      WebBrowser1.Navigate('http://www.ghisler.com/', Flags);
    end;
    

    它运行良好(Delphi XE7)。我看到 TC 主页,单击超链接,然后再次单击 Button2,计数器是新的。当我只使用 Navigate(URL) 时,计数器仍然是一样的。

    【讨论】:

    • 我们都喜欢吉斯勒!!!!!!!!!我们不是吗? Total Commander 无疑是我最喜欢的程序。吉斯勒先生,一百万谢谢你的珠宝。也许 Embarcadero 可以从他身上学到一些东西(比如没有错误的软件是可能的)。
    【解决方案3】:

    Browser.EnableCaching:=False;

    浏览器.导航;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多