【问题标题】:Asynchronous Pluggable Protocol for CID: (email), how to handle duplicate URLsCID 的异步可插入协议:(电子邮件),如何处理重复的 URL
【发布时间】:2014-03-21 02:51:27
【问题描述】:

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

如果您正在使用 WebBrowser 控件的多个实例、MSHTML、IHTMLDocument 或其他...从 APP 实例内部,主要是 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 的 URL(我现在正在为临时文件做这件事,但想用更好的方式来做)。

IInternetBindInfo::GetBindString 可以返回引荐来源网址 BINDSTRING_XDR_ORIGIN 或根 URL BINDSTRING_ROOTDOC_URL,但这些需要更新版本的 IE,而且我的旧版应用程序必须支持甚至可能有 IE6 或 IE7 的旧 XP 安装,所以我宁愿不要使用这些。

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

【问题讨论】:

    标签: webbrowser-control twebbrowser


    【解决方案1】:

    作为我们非常底层的异步可插入协议处理程序,您不能将处理程序单独附加到不同的呈现控件。

    这里是获取referrer的方法:

    1. 获取BINDSTRING_HEADERS
    2. 通过解析Referer: http://...这一行来提取引荐来源网址。
    3. 另见How can I add an extra http header using IHTTPNegotiate?

    这是另一种疯狂的方式:

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

    【讨论】:

    • 谢谢,甚至没有考虑使用标题。我永远不会在普通网站上信任它们,但在这种情况下,它是一个更受控的环境,并且总是 IE 为控件提供动力,所以看起来很健壮。
    猜你喜欢
    • 2011-01-02
    • 2019-12-07
    • 2017-07-13
    • 1970-01-01
    • 2013-05-02
    • 2018-06-28
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多