jiangsheng在不在?masterz在吗?
问题1,我要把网页里的script的源代码弄出来,用IHTMLDocument2::get_scripts(IHTMLElementCollection** p);获得script的集合,然后我一个一个地item出每个IHTMLElement指针,最后用IHTMLElement::get_innerHTML获得源代码。可是每次都得到一行5、6个字符的乱码。谁能告诉我如何把HTML里的script源代码弄出来?
问题2,想不起来了,想起来再问
问题1,我要把网页里的script的源代码弄出来,用IHTMLDocument2::get_scripts(IHTMLElementCollection** p);获得script的集合,然后我一个一个地item出每个IHTMLElement指针,最后用IHTMLElement::get_innerHTML获得源代码。可是每次都得到一行5、6个字符的乱码。谁能告诉我如何把HTML里的script源代码弄出来?
问题2,想不起来了,想起来再问
MessageBox(bstr);看看
MessageBox(bstr);
应该是
MessageBox(str);
...//class CViewScriptSrcView : public CHtmlViewvoid CViewScriptSrcView::OnViewscriptsrc()
{
LPDISPATCH lpdisp=this->GetHtmlDocument();
MSHTML::IHTMLDocument2Ptr pdoc2(lpdisp);
lpdisp->Release();
MSHTML::IHTMLElementCollectionPtr pcoll=pdoc2->Getscripts();
long lcount;
pcoll->get_length(&lcount);
if(lcount>0)
{
IDispatchPtr disp=pcoll->item(COleVariant(short(0)),COleVariant((short)0));
MSHTML::IHTMLScriptElementPtr script(disp);
BSTR bstrsrc;
script->get_text(&bstrsrc);
_bstr_t bsr2(bstrsrc);
::MessageBox(NULL,bsr2,"scriptsrc",MB_OK);
SysFreeString(bstrsrc);
}
}
...//class CViewScriptSrcView : public CHtmlViewvoid CViewScriptSrcView::OnViewscriptsrc()
{
IHTMLDocument2* pDoc2 = (IHTMLDocument2* )this->GetHtmlDocument();
if(pDoc2 == NULL)
return; IHTMLElementCollection * pAllElem = NULL;
IHTMLElement *pElem = NULL; pDoc2->get_scripts(&pAllElem);
if(pAllElem!=NULL)
{
long p;
VARIANT name;
name.vt = VT_I4;
pAllElem->get_length(&p);
if(p>0)
{
for(int i=0; i<p; i++)
{
name.lVal = i;
if(pAllElem->item(name, name, (LPDISPATCH*)&pElem)==S_OK)
{
if(pElem != NULL)
{
BSTR bstr;
pElem->get_innerHTML(&bstr);
AfxMessageBox(CString(bstr));//5、6个乱字符
::SysFreeString(bstr);
pElem->Release();
pElem = NULL;
}
}
}
}
pAllElem->Release();
pAllElem = NULL;
}
pDoc2->Release();
}
if(pAllElem->item(name, name, (LPDISPATCH*)&pElem)==S_OK)
这里错了,你不能把COM接口指针强制转换的,即使一个接口的对象总是支持另外一个接口。
CComQIPtr<IDispatch> pDispTemp;
if(m_pLastForm->item(_variant_t(_bstr_t("check")),varDummy,&pDispTemp.p)==S_OK){
CComQIPtr<IHTMLInputHiddenElement> pInput(pDispTemp);
if(pInput){
pInput->put_value(bstrTime);
}
}
struct IA:public IUnknown
{};
struct IB:public IUnknown
{};
CA:public IA{};
CB:public IB{};
struct IC:public IUnknown
{
};
CC:public IC
{
A a;
B b;
HRESULT QueryInterface(REFIID riid, LPVOID* obp);
);HRESULT CC::QueryInterface(REFIID riid, LPVOID* obp)
{
*ppv=NULL;
if (riid == IID_IUnknown)
*ppv=this;
if (riid == IID_IA)
*ppv=&a;
if (riid == IID_IB)
*ppv=&b;
if (NULL==*ppv)
return ResultFromScode(E_NOINTERFACE);
((IUnknown*)*ppv)->AddRef();
return NOERROR;
}
}