【问题标题】:Why DWebBrowserEvents2::NewProcess() receives pWB2==NULL in second parameter为什么 DWebBrowserEvents2::NewProcess() 在第二个参数中接收 pWB2==NULL
【发布时间】:2015-07-26 09:24:33
【问题描述】:
此调度也称为DISPID_NEWPROCESS。
如果您使用CoCreateInstance(CLSID_InternetExplorer) 启动新的IWebBrowser2,则默认情况下它将以保护模式启动(您可以在 Internet 选项 | 安全 | Internet | 启用保护模式中看到它)。但是,如果您随后 Navigate() 访问“受信任的站点”列表中的 URL,则需要在没有保护模式的情况下打开它。然后IE会默默地创建一个新进程,使旧的IWebBrowser2失效,并创建一个新的IWebBrowser2。那么你的IWebBrowser2就变得没用了,这肯定是个问题。
但是,IE 应该触发 DISPID_NEWPROCESS 事件,该事件的第二个参数中应该有 IDispatch* 用于新进程。
问题是pWB2 参数将包含NULL。
【问题讨论】:
标签:
internet-explorer
com
automation
bho
【解决方案1】:
我调试了IE,发现如果你的ProtectedMode(低完整性)@987654322@变成非ProtectedMode(中等完整性)@987654323@,参数将有NULL。
详情:
有趣的代码位于IEFRAME!CIEFrameAuto::_HandleProtectedModeRedirect()。它将调用IEFRAME!IsProtectedModeProcess(),并根据其结果最终将调用FireEvent_NewProcess() 并将pWB2 参数显式设置为NULL,或调用FireEvent_NewProcess() 并使用包含良好值的pWB2 参数。
我相信原因是安全性。否则,您可以从低完整性应用程序启动低完整性 IWebBrowser2,然后导航到受信任的 URL,并获取中等完整性 IWebBrowser2,这基本上是权限提升。