在 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。