为什么 DWebBrowserEvents2::NewProcess() 在第二个参数中接收 pWB2==NULL
Why DWebBrowserEvents2::NewProcess() receives pWB2==NULL in second parameter
此调度也称为 DISPID_NEWPROCESS
。
如果您使用 CoCreateInstance(CLSID_InternetExplorer)
启动新的 IWebBrowser2
,那么它将默认以保护模式启动(您可以在 Internet 选项 | 安全 | Internet | 启用保护模式中看到它)。但是,如果您随后 Navigate()
到 "Trusted sites" 列表中的 URL,那么它将需要在没有保护模式的情况下打开。然后 IE 会默默地创建一个新进程,使旧的 IWebBrowser2
失效并创建一个新的 IWebBrowser2
。那你的IWebBrowser2
就没用了,肯定是有问题的
然而,IE 应该触发 DISPID_NEWPROCESS
事件,它的第二个参数应该有新进程的 IDispatch*
。
问题是 pWB2
参数将包含 NULL
.
我调试了 IE,发现如果你的 ProtectedMode(低完整性)IWebBrowser2
变成非 ProtectedMode(中等完整性)IWebBrowser2
,参数将有 NULL
。
详情:
有趣的代码位于IEFRAME!CIEFrameAuto::_HandleProtectedModeRedirect()
。它将调用 IEFRAME!IsProtectedModeProcess()
并根据其结果最终调用 FireEvent_NewProcess()
且 pWB2
参数显式设置为 NULL,或 FireEvent_NewProcess()
且 pWB2
参数包含良好值.
我认为原因是安全性。否则,您可以从低完整性应用程序启动低完整性 IWebBrowser2
,然后导航到受信任的 URL,并保持中等完整性 IWebBrowser2
,这基本上是一种特权升级。
此调度也称为 DISPID_NEWPROCESS
。
如果您使用 CoCreateInstance(CLSID_InternetExplorer)
启动新的 IWebBrowser2
,那么它将默认以保护模式启动(您可以在 Internet 选项 | 安全 | Internet | 启用保护模式中看到它)。但是,如果您随后 Navigate()
到 "Trusted sites" 列表中的 URL,那么它将需要在没有保护模式的情况下打开。然后 IE 会默默地创建一个新进程,使旧的 IWebBrowser2
失效并创建一个新的 IWebBrowser2
。那你的IWebBrowser2
就没用了,肯定是有问题的
然而,IE 应该触发 DISPID_NEWPROCESS
事件,它的第二个参数应该有新进程的 IDispatch*
。
问题是 pWB2
参数将包含 NULL
.
我调试了 IE,发现如果你的 ProtectedMode(低完整性)IWebBrowser2
变成非 ProtectedMode(中等完整性)IWebBrowser2
,参数将有 NULL
。
详情:
有趣的代码位于IEFRAME!CIEFrameAuto::_HandleProtectedModeRedirect()
。它将调用 IEFRAME!IsProtectedModeProcess()
并根据其结果最终调用 FireEvent_NewProcess()
且 pWB2
参数显式设置为 NULL,或 FireEvent_NewProcess()
且 pWB2
参数包含良好值.
我认为原因是安全性。否则,您可以从低完整性应用程序启动低完整性 IWebBrowser2
,然后导航到受信任的 URL,并保持中等完整性 IWebBrowser2
,这基本上是一种特权升级。