为什么 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,这基本上是一种特权升级。