Здравствуйте, уважаемые господа!
Уж не знаю, пару дней назад мой вопрос то ли показался слишком сложным, то ли я неясно его объяснил. У меня назрел вот какой.
Гляньте на вот этот код :
void CSuperHook::BeforeNavigate2(IDispatch* pDisp,
VARIANT* url,
VARIANT* Flags,
VARIANT* TargetFrameName,
VARIANT* PostData,
VARIANT* Headers,
VARIANT* Cancel){
BSTR bstrUrl = GetBSTR(url);
BSTR target = GetBSTR(TargetFrameName);
if (!bstrUrl) return;
if (!target && (_wcsnicmp(bstrUrl,L"http",4) == 0)) // cancel it, and redo it
{
CComPtr<IWebBrowser2> pWeb2;
if (SUCCEEDED(pDisp->QueryInterface(IID_IWebBrowser2,(void**)&pWeb2)))
{
// cancel navigation
*Cancel->pboolVal = VARIANT_TRUE;
// create param
VARIANT frame;
frame.vt = VT_BSTR;
frame.bstrVal = SysAllocString(L"_blank");
// do it
pWeb2->Stop();
pWeb2->Navigate2(url,Flags,&frame,PostData,Headers);
// clean up
SysFreeString(frame.bstrVal);
}
}
else if (wcsncmp(bstrUrl,L"about:blank",11) == 0)
{
CComPtr<IWebBrowser2> pWeb2;
if (SUCCEEDED(pDisp->QueryInterface(IID_IWebBrowser2,(void**)&pWeb2)))
{
// cancel navigation
*Cancel->pboolVal = VARIANT_TRUE;
VARIANT frame,url2;
frame.vt = VT_BSTR;
frame.bstrVal = SysAllocString(L"_blank");
url2.vt = VT_BSTR;
url2.bstrVal = SysAllocString(bstrUrl+11);
// do it
pWeb2->Stop();
pWeb2->Navigate2(&url2,Flags,&frame,PostData,Headers);
// clean up
SysFreeString(frame.bstrVal);
SysFreeString(url2.bstrVal);
}
}
}
Почему у меня при попытке навигации по определенному адресу в IE6 открывается новое окно и навигация в нем идет по вот этой бяке :
res://C:\WINNT\system32\shdoclc.dll/navcancl.htm ???
Или я в коде чего-то не понимаю или как ? кажется, явно указано :
pWeb2->Stop();
pWeb2->Navigate2(url,Flags,&frame,PostData,Headers); // go to specific address
// clean up
.
Здравствуйте, tomek, Вы писали:
T>T>void CSuperHook::BeforeNavigate2(IDispatch* pDisp,
T> VARIANT* url,
T> VARIANT* Flags,
// Похоже что тут они имеют значение по умолчанию. Но точно сказать не могу.
// Посмотрите на присутствие navOpenInNewWindow в данном наборе.
T> VARIANT* TargetFrameName,
T> VARIANT* PostData,
T> VARIANT* Headers,
T> VARIANT* Cancel){
T> BSTR bstrUrl = GetBSTR(url);
T> BSTR target = GetBSTR(TargetFrameName);
T> if (!bstrUrl) return;
T> if (!target && (_wcsnicmp(bstrUrl,L"http",4) == 0)) // cancel it, and redo it
T> {
T> CComPtr<IWebBrowser2> pWeb2;
T> if (SUCCEEDED(pDisp->QueryInterface(IID_IWebBrowser2,(void**)&pWeb2)))
T> {
T> // cancel navigation
T> *Cancel->pboolVal = VARIANT_TRUE;
T> // create param
T> VARIANT frame;
T> frame.vt = VT_BSTR;
T> frame.bstrVal = SysAllocString(L"_blank");
T> // do it
T> pWeb2->Stop();
__variant_t vtFlags( LONG( 0 ) );
pWeb2->Navigate2(url,vtFlags,&frame,PostData,Headers);
T> // clean up
T> SysFreeString(frame.bstrVal);
T> }
T> }
T> else if (wcsncmp(bstrUrl,L"about:blank",11) == 0)
...
T>
К примеру можно поставить Flags в 0. Более побробно нужно смотреть в MSDN по поводу данного параметра.
Здравствуйте, tomek, Вы писали:
Look at last param of BeforeNavigate2(): VARIANT* Cancel;
If *Cancel = True,
cancel the navigation operation;( don't need pWeb2->Stop())
Then to next event, for example DownloadBegin(), make your navigation,
__variant_t vtFlags( LONG( 0 ) );
pWeb2->Navigate2(url,vtFlags,&frame,PostData,Headers);