перечислять формы в событии BeforeNavigate2

Я пишу IE BHO, я хотел бы знать, как перечислить формы в обратном вызове события.
Вот код, который перечисляет формы в событии BeforeNavigate2, но длина всегда равна 0.

STDMETHODIMP CEventSink::Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr)
{
HRESULT hr;
char bf[1024];

if(!IsEqualIID(riid, IID_NULL))
return DISP_E_UNKNOWNINTERFACE;

if(dispIdMember == DISPID_BEFORENAVIGATE2) {

IWebBrowser2* pSite = (IWebBrowser2*)pDispParams->rgvarg[6].pdispVal;

IDispatch* pHtmlDocDispatch;
hr = pSite->get_Document(&pHtmlDocDispatch);
if (FAILED(hr) || !pHtmlDocDispatch)
return S_OK;

IHTMLDocument2* pHtmlDoc = 0;

hr = pHtmlDocDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);

if(SUCCEEDED(hr) && pHtmlDoc) {
CComPtr<IHTMLElementCollection> pColl=NULL;
hr = pHtmlDoc->get_forms(&pColl);

if (SUCCEEDED (hr) && (pColl != NULL))
{
long nLength = 0;
hr = pColl->get_length (&nLength);

if(SUCCEEDED(hr)) {
sprintf(bf, "len = %d", nLength);
OutputDebugString(bf); // always 0
}
}
}
}
return S_OK;
}

Почему всегда выводится 0?

Благодарю.

0

Решение

Я просто скопировал / вставил ваш код в мой BHO и получил коллекцию ненулевой длины.

Попробуйте этот URL: http://linuxfr.org/ Используйте случайные значения пользователя / пароля и попробуйте подключиться. Это вызовет DISPID_BEFORENAVIGATE2 и вы получите 3 формы.

Таким образом, кажется, что на странице, которую вы перемещаете, нет формы.

Кроме того, ваш код теряет память и не совсем корректен при использовании интерфейсов COM (ag: вы должны QueryInterface для получения IWebBrowser2 из IDispatch,

переписан:

CComPtr<IDispatch> spIDispatch( pDispParams->rgvarg[6].pdispVal );
CComPtr<IWebBrowser2> spIWebBrowser2;
HRESULT hr = spIDispatch.QueryInterface<IWebBrowser2>( &spIWebBrowser2 );
if ( SUCCEEDED( hr ) && spIWebBrowser2 ) {
CComPtr<IDispatch> spIDispatchDoc;
hr = spIWebBrowser2->get_Document( &spIDispatchDoc );
if ( SUCCEEDED( hr ) && spIDispatchDoc ) {
CComPtr<IHTMLDocument2> spIHTMLDocument2;
hr = spIDispatchDoc.QueryInterface<IHTMLDocument2>( &spIHTMLDocument2 );
if ( SUCCEEDED( hr ) && spIHTMLDocument2 ) {
CComPtr<IHTMLElementCollection> spIHTMLElementCollection;
hr = spIHTMLDocument2->get_forms( &spIHTMLElementCollection );
if ( SUCCEEDED( hr ) && spIHTMLElementCollection ) {
[...]
}
}
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]