我使用cwebpage_src代码,我需要在单击链接时更新一些 HTTP 请求标头。据我了解,可以通过 IHttpNegotiate->BeginTransaction 的自我实现来完成。但是如何调用我的 IHttpNegotiate 实现?
谢谢!
我使用cwebpage_src代码,我需要在单击链接时更新一些 HTTP 请求标头。据我了解,可以通过 IHttpNegotiate->BeginTransaction 的自我实现来完成。但是如何调用我的 IHttpNegotiate 实现?
谢谢!
虽然我没有写过的经验,但我相信你需要写一个异步可插拔协议,正如这个线程中推荐的那样。
如何以及为什么这样做的详细信息散布在网络上的各个地方,但我读过的最好的阐述是 Igor Tandetnik 的这篇文章(为简洁起见,在此删减):
有几个技术层支持 Internet Explorer 和 WebBrowser 控件中的下载和导航。在顶部,有 WebBrowser 本身和提供 HTML 解析和呈现的 MSHTML 对象。客户端使用 IWebBrowser2 和 IHTMLDocument2 等接口与这些高级对象进行通信。
WebBrowser 和 MSHTML 使用 URL Monikers 库来执行实际下载。URLMon 通过 IMoniker 和 IBinding 接口公开其服务,客户端(例如 MSHTML)实现 IBindStatusCallback 和许多相关接口,例如 IHttpNegotiate 或 IAuthenticate。
接下来是一个异步可插入协议处理程序。一个APP封装了特定协议的细节,例如http、file或res。
...
大多数时候,托管 WebBrowser 控件(或在 IE 中运行的 BHO)的应用程序使用 WebBrowser 和 MSHTML 对象提供的高级服务。但是,有时这些服务是不够的,需要一个较低级别的钩子。
...
如果能够连接到 WebBrowser/MSHTML 和 URL Monikers 之间的通信序列,那就太好了。不幸的是,似乎没有任何方法可以做到这一点 - 至少,据我所知没有。所以,我们看下一个层次 - URL moniker 和 APP 之间的通信。
...
现在,很少需要从头开始实现一个成熟的应用程序——毕竟,新协议实际上多久定义一次?但就我们的目的而言,实现所谓的透传 APP (pAPP) 很有用。pApp 是实现 URL moniker-to-APP 通信双方的对象,即它同时实现 IInternetProtocol 和 IInternetProtocolSink / IInternetBindInfo。我们将其注册为标准协议(例如 HTTP)的临时处理程序。现在,每当需要发送 HTTP 请求时,URL moniker 将创建我们的 pAPP 实例并要求它完成这项工作。然后 pAPP 为相关协议创建一个标准 APP 的实例(我称它为目标 APP 或 tAPP,但请注意,我自己发明了这个术语,它没有被广泛接受,欢迎提出更好的命名约定的建议)并充当其客户。在这一点上,我们的 pAPP 变成了众所周知的中间人。在最简单的情况下,pAPP 上的 URL Moniker 进行的任何方法调用都会转发给 tAPP,pAPP 上的 tAPP 进行的任何方法调用都会转发回 URL Moniker。pAPP 开始观察并在需要时修改与此请求相关的每一位信息,这些信息在 moniker 和 tAPP 之间来回传递。
Igor 有几个示例项目可以帮助您编写自己的项目pAPP
: