为什么从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;
}
...全文
262 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sffshh 2005-04-15
  • 打赏
  • 举报
回复
我也想知道啊,大虾介绍点资料呀,我QQ29114852,大家交流一下
wkwhl 2005-04-12
  • 打赏
  • 举报
回复
happysubmit(快乐登录)
你做的这个和我的需求很相像阿。兄弟能介绍一下有多个frame的网页的document2接口怎么得到??
wkwhl 2005-04-12
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.MSMVP2004Jan)
老大 你这方面很厉害的,能给点好的建议么??我的代码为什么错了??
wkwhl 2005-04-12
  • 打赏
  • 举报
回复
roger_ding(海天一色) 用SUCCEEDED和FAILED宏只能知道一个com接口函数是不是调用成功了,比如我调用get_document的结构就是-2733411,所以就是failed。这帮不了我改正程序的,也不知道我具体错在哪里了。
蒋晟 2005-04-11
  • 打赏
  • 举报
回复
估计错误是E_ACCESS_DENIED 0x80070005
不明白COM错误的含义的话可以上网搜索错误代码
roger_ding 2005-04-11
  • 打赏
  • 举报
回复
如果frame是跨域访问,则get_Document会失败
happysubmit 2005-04-11
  • 打赏
  • 举报
回复
推荐给你一个软件,
http://community.csdn.net/Expert/topic/3905/3905930.xml?temp=.4875299

使用其中的“查看网页源文件”功能,可以用树状效果查看网页的frame结构以及每个frame的源文件,你可以参考一下:)
roger_ding 2005-04-11
  • 打赏
  • 举报
回复
检查COM函数返回是否正确一般用SUCCEEDED和FAILED宏,GetLastError一般不相关!

跨域访问一般指某个链接地址链接到了其它的网站
wkwhl 2005-04-11
  • 打赏
  • 举报
回复
get_Documentd 的返回值是很小的负数,但是此时用Getlasterror返回的errorcode是0,也就是没有错误发生。 roger_ding(海天一色)说的跨域访问时什么意思??

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧