为什么从IHTMLWindow2调用get_Document()的返回值是一个很小的负数??是失败的值呢?
wkwhl 2005-04-11 10:02:26 我写了一个函数,具体就是查看一个网页,看他有几个frame,frame里面可能还有frame,所以用了第归。如果没有frame了我就得到那个frame的IHTMLWindow2接口,再得到IHTMLDocument2接口。问题就是在得到frame的IHTMLDocument2的时候失败了。
希望大家多多 指教阿,困扰我很久了。
void CAutoRefreshDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
BOOL ret=FALSE;
if (m_spSHWinds == NULL)
{
if (m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)
{
MessageBox("Failed");
CoUninitialize();
EndDialog(1);
}
}
HRESULT hr;
CComPtr<IDispatch> spDispatch;
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pDoc2;
CComPtr<IHTMLElement> pElement;
CComPtr<IHTMLElementCollection> pElementCol;
CComPtr<IHTMLFormElement> pFormElement;
CComPtr<IHTMLInputTextElement> pInputElement;
CComPtr<IHTMLFramesCollection2> pFramesCol;
CComPtr<IHTMLWindow2> pFrameWindow;
SHDocVw::IWebBrowser2Ptr myWebBrowserPtr=0;
m_ctrlIE.DeleteAllItems();
if (m_spSHWinds)
{
int n = m_spSHWinds->GetCount();
for (int i = 0; i < n; i++)
{
_variant_t v = (long)i;
IDispatchPtr spDisp = m_spSHWinds->Item(v);
//create a ie auto pointer
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
if (spBrowser)
{
long Hwnd=0;;
if(SUCCEEDED(spBrowser->get_HWND(&Hwnd)))
{
//get the ie window tilte
char title[128]={0};
::SendMessage((HWND)Hwnd,WM_GETTEXT,(WPARAM)128,(LPARAM)title);
//if(m_title==title)
{
spDispatch=0;
if (SUCCEEDED(spBrowser->get_Document(&spDispatch)))
if(pDoc2 = spDispatch)
{
pFramesCol=0;
long len;
hr=pDoc2->get_frames(&pFramesCol);
if (SUCCEEDED(hr))
{
VARIANT frameOut;
VARIANT frameRequested;
hr=pFramesCol->get_length(&len);
if(SUCCEEDED(hr)&&len!=0)
{
GetDocumentFromFrames(pFramesCol,len);
}else ret=checkFromIterDocument(pDoc2);//only single frame
}
}
}
}
}
}
}
if (m_spSHWinds)
{
m_spSHWinds.Release();
m_spSHWinds = 0;
}
}
BOOL CAutoRefreshDlg::GetDocumentFromFrames(IHTMLFramesCollection2 *pFrame,long len)
{
BOOL ret=FALSE;
CComPtr<IHTMLFramesCollection2> pFramesCol;
CComPtr<IHTMLWindow2> pFrameWindow;
CComPtr<IHTMLDocument2> pDoc;
HRESULT hr;
VARIANT frameOut;
VARIANT frameRequested;
if(len>0.0001)
{
for(long i=0;i<len;i++)
{
V_VT(&frameRequested) = VT_I4;
V_I4(&frameRequested) = i;
pFrameWindow=NULL;
hr = pFrame->item(&frameRequested, &frameOut);
if(SUCCEEDED(hr))
{
hr = frameOut.pdispVal->QueryInterface(IID_IHTMLWindow2, (void**)&pFrameWindow);
if(SUCCEEDED(hr))
{
long num=0;
pFramesCol=0;
hr=pFrameWindow->get_frames(&pFramesCol);
hr=pFramesCol->get_length(&num);
if(SUCCEEDED(hr))
{
if(num>0.0001)
{
GetDocumentFromFrames(pFramesCol,num);
}
else
{
pDoc=0;
hr=pFrameWindow->get_document(&pDoc);
if(SUCCEEDED(hr))
{
//the default case is that there is no frame set in the window
if(ret=checkFromIterDocument(pDoc))
{
return ret;
}
}else AfxMessageBox("Get Doc Error");
}
}
}
}
}
}
return ret;
}