采用ATL的方式封装IE,添加DISPID_NEWWINDOW3的事件处理,
SINK_ENTRY_Ex(IDC_IEXPLORE,DIID_DWebBrowserEvents2,DISPID_NEWWINDOW3,_OnNewWIndw3)
在该函数的处理如下:
_OnNewWindow3(LPDISPATH *ppDisp,VARIANT_BOOL *cancel,DWORD dwFlags,BSTR bstrUrlContext,BSTR bstrUrl)
{
IEView *ieView = new IEView;
RECT rc;
::GetClientRect(hProcessWnd,&rc);
ieView->Create(hHostWnd,&rc,L"",WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPSBLINGS|Ws_CLIPCHILDREN);
ieView->m_pWebBrowser->QueryInterface(IID_IDispatch,(void**)ppDisp);
}
IEView继承与CWindowImpl(IEView,CAxWindow> 和IDispEventImpl<IDC_IEPLORE,IEView,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1,0>.
出现的问题描述一下:
我在一个页面里面打开一个新链接,打开的方式为:myWindow = window.open(url)。返回的myWindow是一个有效的值,JS里面开启一个定时器,不断的检查myWindow是否关闭。我调试的时候能看到myWindow的各个属性。然后我将打开的页面关闭,关闭的方法是window.close(),然后再看myWindow的值,VS提示的是没有权限。另外,打开和被打开的URL都是在同一个IP地址的同一个端口下,应该不存在跨域的问题。
我尝试了一下方法,因为我打开的时候有QueryInterface,所以应该是有refer信息的,并且我打开新url的返回值myWindow也是有效的。
如果我将_OnNewWindow3的参数cancel设为*cancel = true,那么myWindow = window.open(url)这个时候myWindow的值就为null。
同时可以确定的是,创建打开和被打开的url的处理都是在同一个进程的同一个线程下面。
我现在的需求就是,在一个页面中打开一个新页面,然后定时器不断检测新打开的页面是否关闭。。。