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

时间:2014-03-19 18:21:45

标签: webbrowser-control twebbrowser

这有点与this question重复,但这个问题没有(有效)答案,并且已经有1.5年的历史了,所以请求我自己希望人们现在有更多的信息。

如果你在APP实例中使用WebBrowser控件的多个实例,MSHTML,IHTMLDocument或其他......,主要是IInternetProtocol :: Start,有没有办法知道哪个实例正在加载资源?或者有没有办法为控件的每个实例使用不同的APP,可能是通过IDocHostUIHandler或ICustomDoc提供一个或其他?我目前正在使用IInternetSession :: RegisterNameSpace来处理它。

可选阅读,除非上述内容尚未明确,否则请不要阅读。

我正在使用遗留(Win32 C ++)电子邮件客户端,该客户端使用MS ActiveX WebBrowser控件(MSHTML或其他名称)来显示HTML电子邮件。它将所有内容保存到临时文件,更新cid:URL,然后控制加载。现在我想用正确的方式,使用APP。我已经完成了一些只使用静态变量/全局变量并加载一封电子邮件的测试代码。

我现在的问题是,应用程序可能有几个控件实例同时加载不同的电子邮件(和其他东西)...实际上不是多个线程,只是控件的异步性质。我可以为控件的每个实例提供一个唯一的URL来加载电子邮件,比如cid:email-GUID,然后在我的APP代码中我可以使用该URL来了解要加载的电子邮件。但是,当涉及到加载电子邮件中的任何内容时,例如使用src =" cid:"附加的图像,那些并不总是唯一的,所以我不会总是知道它是哪个图像,对于哪个电子邮件。我希望避免在显示HTML之前修改HTML的URL(我现在正在为临时文件执行此操作,但希望以更好的方式执行此操作)。

IInternetBindInfo :: GetBindString可以返回引用者,BINDSTRING_XDR_ORIGIN或根URL,BINDSTRING_ROOTDOC_URL,但那些需要较新版本的IE,我的遗留应用程序必须支持可能拥有IE6或IE7的旧XP安装,所以我' d而不是使用这些。

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

1 个答案:

答案 0 :(得分:1)

由于异步可插入协议处理程序的级别很低,因此无法将处理程序单独附加到不同的渲染控件。

以下是获取推荐人的方法:

  1. 获取BINDSTRING_HEADERS
  2. 通过解析行Referer: http://...来提取引荐来源。
  3. 另见How can I add an extra http header using IHTTPNegotiate?
  4. 这是另一种疯狂的方式:

    1. 通过调用RegisterMimeFilter创建另一个异步可插入协议处理程序。
    2. 监控text/plaintext/html
    3. 扫描传入的电子邮件来源(内容以递增方式提供)并解析存储字典中的所有图像链接
    4. NameSpaceHandler中,您可以使用此词典查找任何图像资源的引用。