网上有用枚举元素的方法来获得子框架,但是这种情况一来好像受到同源策略的影响,二来无法在框架的js被执行前获得控制,所以想通过DISPID_NAVIGATECOMPLETE2等事件发生时获取IHTMLWindow2对象,但是碰到一些问题,以下是我的代码 case DISPID_NAVIGATECOMPLETE2:
{
HRESULT hr = S_OK; CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pWeb;
pWeb = pDispParams->rgvarg[1].pdispVal;
LPOLESTR lpURL = NULL;
pWeb->get_LocationURL(&lpURL);
MessageBox(NULL, lpURL, _T(""), 0); IHTMLDocument2 *pDoc = NULL;
hr = pWeb->get_Document((IDispatch **)&pDoc);
if (SUCCEEDED(hr) && pDoc != NULL)
{
MessageBox(NULL, _T("docs"), _T(""), 0); IHTMLWindow2 *pWnd = NULL;
hr = pDoc->get_parentWindow(&pWnd);
if (SUCCEEDED(hr) && pWnd != NULL)
{
MessageBox(NULL, _T("wnd"), _T(""), 0);
}// IDispatch *pdispScript = NULL;
// hr = pDoc->get_Script((IDispatch **)&pdispScript);
// if (SUCCEEDED(hr) && pdispScript != NULL)
// {
// MessageBox(NULL, _T("script"), _T(""), 0);
// }
} break;
}无论在调用get_parentWindow还是get_Script的过程中都会使得浏览器崩溃,不知道为何
{
HRESULT hr = S_OK; CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pWeb;
pWeb = pDispParams->rgvarg[1].pdispVal;
LPOLESTR lpURL = NULL;
pWeb->get_LocationURL(&lpURL);
MessageBox(NULL, lpURL, _T(""), 0); IHTMLDocument2 *pDoc = NULL;
hr = pWeb->get_Document((IDispatch **)&pDoc);
if (SUCCEEDED(hr) && pDoc != NULL)
{
MessageBox(NULL, _T("docs"), _T(""), 0); IHTMLWindow2 *pWnd = NULL;
hr = pDoc->get_parentWindow(&pWnd);
if (SUCCEEDED(hr) && pWnd != NULL)
{
MessageBox(NULL, _T("wnd"), _T(""), 0);
}// IDispatch *pdispScript = NULL;
// hr = pDoc->get_Script((IDispatch **)&pdispScript);
// if (SUCCEEDED(hr) && pdispScript != NULL)
// {
// MessageBox(NULL, _T("script"), _T(""), 0);
// }
} break;
}无论在调用get_parentWindow还是get_Script的过程中都会使得浏览器崩溃,不知道为何
hr = pWeb->get_Document((IDispatch **)&pDoc);这句有问题
应该是先查询IDispatch,再查询QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);