【发布时间】: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