Javascript 获取IFrame';使用VC++;组件对象模型 变量varindex、varresult; VariantInit(和varindex); VariantInit(&varresult); varindex.vt=vt_I4; varresult.vt=vt_调度; 长lFrameNum=0; CComPtr PFRAMES集合; hr=m_spDoc->get_frames(&pFramesCollection)//中国邮政总局局长 如果(失败(小时)) { 返回false; } hr=pFramesCollection->get_length(&lFrameNum); 如果(失败(小时)) { 返回false; } 对于(int i=0;iitem(&varindex,&varresult)==S_OK) { IDispatch*pDispatch; pDispatch=varresult.pdispVal; CComQIPtrspFrameBase(pDispatch); 如果(!spFrameBase)返回false;//此处失败,则E_NOINTERFACE } }
这里的代码显示了如何枚举网页中的帧并获取其名称。我成功地获取了每个iframe的Javascript 获取IFrame';使用VC++;组件对象模型 变量varindex、varresult; VariantInit(和varindex); VariantInit(&varresult); varindex.vt=vt_I4; varresult.vt=vt_调度; 长lFrameNum=0; CComPtr PFRAMES集合; hr=m_spDoc->get_frames(&pFramesCollection)//中国邮政总局局长 如果(失败(小时)) { 返回false; } hr=pFramesCollection->get_length(&lFrameNum); 如果(失败(小时)) { 返回false; } 对于(int i=0;iitem(&varindex,&varresult)==S_OK) { IDispatch*pDispatch; pDispatch=varresult.pdispVal; CComQIPtrspFrameBase(pDispatch); 如果(!spFrameBase)返回false;//此处失败,则E_NOINTERFACE } },javascript,visual-c++,com,webbrowser-control,Javascript,Visual C++,Com,Webbrowser Control,这里的代码显示了如何枚举网页中的帧并获取其名称。我成功地获取了每个iframe的IDispatch,但是当我尝试获取IHTMLFrameBase(IID\u IHTMLFrameBase)时,它失败了,出现错误E\u NOINTERFACE 我不熟悉COM,我做错了什么?请帮帮我,提前谢谢。不过,我没有直接获得框架名称,但我找到了如何获取该特定框架的IHTMLDocument2*。然后,我可以对框架做一些事情,比如调用它的js函数等。代码如下: VARIANT varindex,varr
IDispatch
,但是当我尝试获取IHTMLFrameBase(IID\u IHTMLFrameBase)
时,它失败了,出现错误E\u NOINTERFACE
我不熟悉COM,我做错了什么?请帮帮我,提前谢谢。不过,我没有直接获得框架名称,但我找到了如何获取该特定框架的IHTMLDocument2*。然后,我可以对框架做一些事情,比如调用它的js函数等。代码如下:
VARIANT varindex,varresult;
VariantInit(&varindex);
VariantInit(&varresult);
varindex.vt = VT_I4;
varresult.vt = VT_DISPATCH;
long lFrameNum = 0;
CComPtr<IHTMLFramesCollection2> pFramesCollection;
hr = m_spDoc->get_frames(&pFramesCollection); //CComPtr<IHTMLDocument2> m_spDoc
if(FAILED(hr))
{
return false;
}
hr = pFramesCollection->get_length(&lFrameNum);
if(FAILED(hr))
{
return false;
}
for(int i=0; i<lFrameNum; i++)
{
varindex.lVal = i;
if(pFramesCollection->item(&varindex, &varresult) == S_OK)
{
IDispatch *pDispatch;
pDispatch = varresult.pdispVal;
CComQIPtr< IHTMLFrameBase > spFrameBase(pDispatch);
if(!spFrameBase) return false; //failed here, E_NOINTERFACE
}
}
您是否尝试将pDispatch强制转换为IHTMLWindow2?MSDN表示
item()
检索IHTMLWindow2*
,而不是IHTMLFrameBase*
。查看是否helps@SimonMouriersharptooth是的,我之前试过IHTMLWindow2*并成功了,但我不知道如何通过IHTMLWindow2*获取帧的name属性。嗯,我现在知道如何通过其名称属性获取框架IDispatch*,谢谢你们,这真的很有帮助。:-)
VARIANT varindex,varresult;
VariantInit(&varindex);
VariantInit(&varresult);
varindex.vt = VT_BSTR;
varindex.bstrVal = "Frame Name"; //the specific frame name
pFramesCollection->item(&varindex,&varresult);
IHTMLWindow2* pFrameWindow;
varresult.pdispVal->QueryInterface(IID_IHTMLWindow2, (void **)&pFrameWindow);
IHTMLDocument2* pDoc;
pFrameWindow->get_document(&pDoc);
//do something ...