masterz,111222过来看看,BHO中判断网页下载完成的问题

kingzai 2002-05-22 05:30:15
我要处理网页中多Frame的情况。在ATL中:
STDMETHODIMP CSpyIE::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
case DISPID_NAVIGATECOMPLETE2:
{
...
}
}
调试发现括号中的内容会执行多次。
参考了MSDN:
HOWTO: Determine When a Page Is Done Loading in WebBrowser Control (Q180366)
在ATL中该怎样判断??
...全文
108 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
0aaron 2002-07-08
  • 打赏
  • 举报
回复
up
kingzai 2002-05-23
  • 打赏
  • 举报
回复
哈哈哈,还是自己搞定了。困扰了好久的问题。
case DISPID_NAVIGATECOMPLETE2:
{
// IUnknown* pUnk;
IDispatch*pDisp=NULL;
HRESULT hr = m_spWebBrowser2->QueryInterface(IID_IDispatch, (void**)&pDisp);
_ASSERT(SUCCEEDED(hr));
if (pDispParams->rgvarg[1].pdispVal == pDisp )
{
m_Disp=pDisp;

CComVariant varURL(*pDispParams->rgvarg[0].pvarVal);
//varURL.ChangeType(VT_BSTR);
// ::AfxMessageBox("aqaa");
strEventInfo << "NavigateComplete2: "
<< OLE2T(varURL.bstrVal)
<< ends;
}
case DISPID_DOCUMENTCOMPLETE:
if (pDispParams->rgvarg[1].pdispVal == m_Disp )
{
MessageBox(NULL,"aaa","bbb",MB_OK);
}
strEventInfo << "DocumentComplete" << ends;
break;
要两个消息联合起来同时来判断,这点其实MSDN上有讲,只是移植到ATL里,嘿嘿,就不是那么简单了。
kingzai 2002-05-23
  • 打赏
  • 举报
回复
刚才调试了一下IEHelper,发现在这个例子中:
// The parameters for this DISPID:
// [0]: URL navigated to - VT_BYREF|VT_VARIANT
// [1]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_NAVIGATECOMPLETE2:
{
if (pDispParams->rgvarg[0].vt == (VT_BYREF|VT_VARIANT))
。。。
}
仍然要执行多次,
看帮助是要使用pDispParams->rgvarg[1]来判断,到底这个应该怎么判断呢

kingzai 2002-05-22
  • 打赏
  • 举报
回复
jiangsheng,这是MSDN的代码,但我要的关键的地方没有,
case DISPID_DOCUMENTCOMPLETE:
strEventInfo << "DocumentComplete" << ends;
break;
这里没做什么处理。。。
我还找到了这段代码的一个错误.
case DISPID_QUIT:
要改成:case DISPID_ONQUIT:
蒋晟 2002-05-22
  • 打赏
  • 举报
回复
Figure 9 Invoke


STDMETHODIMP CIEHlprObj::Invoke(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags,
DISPPARAMS* pDispParams,
VARIANT* pvarResult,
EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
USES_CONVERSION;
strstream strEventInfo;

if (!pDispParams)
return E_INVALIDARG;

// Get the current URL
//
LPOLESTR lpURL = NULL;
m_spWebBrowser2->get_LocationURL(&lpURL);

switch (dispidMember)
{
// The parameters for this DISPID are as follows:
// [0]: Cancel flag - VT_BYREF|VT_BOOL
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT
// [3]: Target frame name - VT_BYREF|VT_VARIANT
// [4]: Option flags - VT_BYREF|VT_VARIANT
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_BEFORENAVIGATE2:
strEventInfo << "BeforeNavigate2: ";

if (pDispParams->cArgs >= 5 &&
pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);

strEventInfo << OLE2T(varURL.bstrVal);
}
else
strEventInfo << "NULL";

strEventInfo << ends;
break;

// The parameters for this DISPID:
// [0]: URL navigated to - VT_BYREF|VT_VARIANT
// [1]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_NAVIGATECOMPLETE2:
if (pDispParams->rgvarg[0].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[0].pvarVal);
varURL.ChangeType(VT_BSTR);

strEventInfo << "NavigateComplete2: "
<< OLE2T(varURL.bstrVal)
<< ends;
}
break;

// The parameters for this DISPID:
// [0]: New status bar text - VT_BSTR
//
case DISPID_STATUSTEXTCHANGE:
LPOLESTR lpStatusText;

m_spWebBrowser2->get_StatusText(&lpStatusText);
strEventInfo << "StatusTextChange: ";

if (!strcmp(OLE2T(lpStatusText), ""))
strEventInfo << "NULL";
else
strEventInfo << OLE2T(lpStatusText);

strEventInfo << ends;
break;

// The parameters for this DISPID:
// [0]: Maximum progress - VT_I4
// [1]: Amount of total progress - VT_I4
//
case DISPID_PROGRESSCHANGE:
strEventInfo << "ProgressChange: ";

if (pDispParams->cArgs == 0)
strEventInfo << "NULL";
else
{
if (pDispParams->rgvarg[0].vt == VT_I4)
strEventInfo << pDispParams->rgvarg[0].lVal;

if (pDispParams->cArgs > 1 && pDispParams->rgvarg[1].vt == VT_I4)
strEventInfo << ", " << pDispParams->rgvarg[1].lVal;
}

strEventInfo << ends;
break;

case DISPID_DOCUMENTCOMPLETE:
strEventInfo << "DocumentComplete" << ends;
break;

case DISPID_DOWNLOADBEGIN:
strEventInfo << "DownloadBegin" << ends;
break;

case DISPID_DOWNLOADCOMPLETE:
strEventInfo << "DownloadComplete" << ends;
break;

// The parameters for this DISPID:
// [0]: Enabled state - VT_BOOL
// [1]: Command identifier - VT_I4

//
case DISPID_COMMANDSTATECHANGE:
strEventInfo << "CommandStateChange: ";

if (pDispParams->cArgs == 0)
strEventInfo << "NULL";
else
{
if (pDispParams->rgvarg[0].vt == VT_BOOL)
strEventInfo << ((pDispParams->rgvarg[0].boolVal ==
VARIANT_TRUE) ? "True" : "False");

if (pDispParams->cArgs > 1 && pDispParams->rgvarg[1].vt == VT_I4)
strEventInfo << ", " << pDispParams->rgvarg[1].lVal;
}

strEventInfo << ends;
break;

case DISPID_NEWWINDOW2:
strEventInfo << "NewWindow2" << ends;
break;

// The parameters for this DISPID:
// [0]: Document title - VT_BSTR
//
case DISPID_TITLECHANGE:
strEventInfo << "TitleChange: ";

if (pDispParams->cArgs > 0 && pDispParams->rgvarg[0].vt == VT_BSTR)
strEventInfo << OLE2T(pDispParams->rgvarg[0].bstrVal);
else
strEventInfo << "NULL";

strEventInfo << ends;
break;

// The parameters for this DISPID:
// [0]: Name of property that changed - VT_BSTR
//
case DISPID_PROPERTYCHANGE:
strEventInfo << "PropertyChange: ";

if (pDispParams->cArgs > 0 && pDispParams->rgvarg[0].vt == VT_BSTR)
strEventInfo << OLE2T(pDispParams->rgvarg[0].bstrVal);
else
strEventInfo << "NULL";

strEventInfo << ends;
break;

// The parameters for this DISPID:
// [0]: Address of cancel flag - VT_BYREF|VT_BOOL
//
case DISPID_QUIT:
strEventInfo << "Quit" << ends;

ManageConnection(Unadvise);
m_dlgEvents.DestroyWindow();
break;

default:
strEventInfo << "Unknown Event" << dispidMember << ends;
break;
}

m_dlgEvents.AddEventToList(strEventInfo.str());

return S_OK;
}

kingzai 2002-05-22
  • 打赏
  • 举报
回复
我的方法还是不行,faint
kingzai 2002-05-22
  • 打赏
  • 举报
回复
好象有点头绪了,发觉在ATL中写法也差不多

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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