异步可插协议的CID:(电子邮件),如何处理重复的url



这个问题有点重复,但是那个问题没有(有效的)答案,并且是1.5年前的问题,所以问我自己的问题,希望人们现在有更多的信息。

如果你正在使用多个实例的WebBrowser控件,MSHTML, IHTMLDocument,或任何…从APP实例内部,主要是IInternetProtocol::Start,有没有办法知道哪个实例正在加载资源?或者有一种方法来使用不同的应用程序的每个实例的控件,也许通过IDocHostUIHandler或ICustomDoc或其他方式提供一个?我目前使用IInternetSession::RegisterNameSpace使其进程范围。

下面的可选阅读,除非上面的内容不清楚,否则不需要阅读

我正在使用MS ActiveX WebBrowser控件(MSHTML或其他名称)来显示HTML电子邮件的传统(Win32 c++)电子邮件客户端。它将所有内容保存到临时文件中,更新cid: url,然后让控件加载它。现在我想用正确的方式来做,使用APP。我已经得到了所有的工作与一些测试代码,只是使用静态变量/全局变量和加载一个电子邮件。

我现在的问题是,应用程序可能有几个实例的控制所有加载不同的电子邮件(和其他东西)在同一时间…并不是真正的多线程,只是控件的异步特性。我可以为控件的每个实例提供一个唯一的URL来加载电子邮件,例如cid:email- guid,然后在我的APP代码中,我可以使用该URL来知道要加载哪个电子邮件。然而,当涉及到在电子邮件中加载任何内容时,比如使用src="cid:"的附加图像,这些并不总是唯一的,所以我并不总是知道它是哪个图像,哪个电子邮件。我想避免在显示它之前修改HTML的url(我现在正在为临时文件做这件事,但想要做一个更好的方式)。

IInternetBindInfo::GetBindString可以返回referrer, BINDSTRING_XDR_ORIGIN,或根URL, BINDSTRING_ROOTDOC_URL,但这些需要较新版本的IE,我的旧应用必须支持旧的XP安装,甚至可能有IE6或IE7,所以我宁愿不使用这些。

标记为TWebBrowser,因为这实际上是我使用的(Borland Builder 6 c++),但不需要特定于该平台的答案。

由于异步可插协议处理程序的级别非常低,因此您不能将处理程序单独附加到不同的呈现控件上。

这里有一个获取引用的方法:

  1. 获取BINDSTRING_HEADERS
  2. 通过解析Referer: http://...行提取引用者。
  3. 参见我如何添加一个额外的http头使用IHTTPNegotiate?

这是另一种疯狂的方式:

  1. 通过调用RegisterMimeFilter创建另一个异步Pluggable Protocol Handler。
  2. 监测text/plaintext/html
  3. 扫描传入的电子邮件源(内容增量)并解析存储在字典中的所有图像链接
  4. NameSpaceHandler中,您可以使用此字典查找任何图像资源的参考。

最新更新