Internet explorer 为什么DWebBrowserEvents2::NewProcess()在第二个参数中接收pWB2==NULL

Internet explorer 为什么DWebBrowserEvents2::NewProcess()在第二个参数中接收pWB2==NULL,internet-explorer,com,automation,bho,Internet Explorer,Com,Automation,Bho,此调度也称为DISPID\u NEWPROCESS 如果您使用CoCreateInstance(CLSID\u InternetExplorer)启动一个新的IWebBrowser2,则默认情况下它将以保护模式启动(您可以在Internet选项|安全| Internet |启用保护模式中看到)。但是,如果然后导航()到“受信任站点”列表中的URL,则需要在不使用保护模式的情况下打开该URL。然后IE将静默地创建一个新进程,使旧的IWebBrowser2无效,并创建一个新的IWebBrowser2

此调度也称为
DISPID\u NEWPROCESS

如果您使用
CoCreateInstance(CLSID\u InternetExplorer)
启动一个新的
IWebBrowser2
,则默认情况下它将以保护模式启动(您可以在Internet选项|安全| Internet |启用保护模式中看到)。但是,如果然后
导航()
到“受信任站点”列表中的URL,则需要在不使用保护模式的情况下打开该URL。然后IE将静默地创建一个新进程,使旧的
IWebBrowser2
无效,并创建一个新的
IWebBrowser2
。然后你的
IWebBrowser2
就没用了,这肯定是个问题

但是,IE应该触发
DISPID_NEWPROCESS
事件,该事件的第二个参数中应该包含新进程的
IDispatch*


问题是,
pWB2
参数将包含
NULL
我已调试IE,并发现如果您的ProtectedMode(低完整性)
IWebBrowser2
变为非ProtectedMode(中等完整性)
IWebBrowser2
,该参数将包含
NULL

详细信息:

有趣的代码位于
IEFRAME!CIEFrameAuto::\u HandleProtectedModeRedirect()
。它将调用
IEFRAME!IsProtectedModeProcess()
并根据其结果最终将调用
FireEvent\u NewProcess()
pWB2
参数显式设置为NULL,或
FireEvent\u NewProcess()
pWB2
参数包含良好值

我相信原因是安全。否则,您可以从低完整性应用程序启动低完整性
IWebBrowser2
,然后导航到受信任的URL,并获得中等完整性
IWebBrowser2
,这基本上是一种权限提升