Приветствую,
перерыл весь rsdn — так и не смог решить свою проблему.
Суть:
Есть dll, которая перехватывает события IE. В частности OnBeforeNavigate2
Разбираю при помощи Invoke
Вот код:
if (dispidMember == DISPID_BEFORENAVIGATE2)
{
BSTR urlW = ((*pDispParams).rgvarg)[5].pvarVal->bstrVal;
CHAR urlA[MAX_PATH] = {0};
WideCharToMultiByte(CP_ACP, 0, (const BSTR)(urlW), -1, urlA, MAX_PATH, NULL, NULL);
urlW = ((*pDispParams).rgvarg)[3].pvarVal->bstrVal;
CHAR frameA[MAX_PATH] = {0};
WideCharToMultiByte(CP_ACP, 0, (const BSTR)(urlW), -1, frameA, MAX_PATH, NULL, NULL);
urlW = ((*pDispParams).rgvarg)[2].pvarVal->bstrVal;
CHAR postdateA[MAX_PATH] = {0};
WideCharToMultiByte(CP_ACP, 0, (const BSTR)(urlW), -1, postdateA, MAX_PATH, NULL, NULL);
urlW = ((*pDispParams).rgvarg)[1].pvarVal->bstrVal;
CHAR headersA[MAX_PATH] = {0};
WideCharToMultiByte(CP_ACP, 0, (const BSTR)(urlW), -1, headersA, MAX_PATH, NULL, NULL);
CViewSource::OnBeforeNavigate(urlA, frameA, headersA, postdateA);
}
.....
HRESULT CViewSource::OnBeforeNavigate(LPTSTR pszUrl, LPTSTR frameA, LPTSTR headersA, LPTSTR postdateA)
{
}
Как бороться с этим событием на fram'ах ? frameA не везде отрабатывает.
Как в этом коде определить — вызвал-ли его frame или основное окно?
Только не пинайте, прочитал все от и до. Нашел много всего по поводу сравнение pDisp.
Но как мне его получить ? Как получить код главного окна и фрэймов ?
Я не силен в С, точнее практически не знаю его, собирал код интуитивно, все работает, осталась только проблема с фрэймами.
Помогите пожалуйста кусочком кода !
При использовании этого кода, все компилируется, но при запуске IE вышибает
CComQIPtr<IWebBrowser2> pWeb(pDisp);
VARIANT_BOOL vb = VARIANT_FALSE;
if(SUCCEEDED(pWeb->get_TopLevelContainer(&vb))){
if(vb == VARIANT_FALSE)
return;
}
Здравствуйте, fromtodo, Вы писали:
F>При использовании этого кода, все компилируется, но при запуске IE вышибает
F>CComQIPtr<IWebBrowser2> pWeb(pDisp);
F>VARIANT_BOOL vb = VARIANT_FALSE;
F>if(SUCCEEDED(pWeb->get_TopLevelContainer(&vb))){
F>if(vb == VARIANT_FALSE)
F>return;
F>}
Наверное, потому, что pWeb == NULL?
Здравствуйте, Vi2, Вы писали:
F>>VARIANT_BOOL vb = VARIANT_FALSE;
F>>if(SUCCEEDED(pWeb->get_TopLevelContainer(&vb))){
F>>if(vb == VARIANT_FALSE)
F>>return;
F>>}
Vi2>[/ccode]
Vi2>Наверное, потому, что pWeb == NULL?
я даже не могу это проверить делаю вот так:
HRESULT CViewSource::OnDocumentComplete(LPDISPATCH pDisp1)
{
CComQIPtr<IWebBrowser2> pWeb(pDisp1);
return S_OK;
}
и тоже вышибает IE.
Возможно в OnDocumentComplete не передается pDisp1 ?
Вызов этой функции осуществляю так:
HRESULT CViewSource::Invoke(.....){
.....
if (dispidMember == DISPID_DOCUMENTCOMPLETE){
LPDISPATCH pDisp1 = ((*pDispParams).rgvarg)[0].pdispVal;
CViewSource::OnDocumentComplete(pDisp1);
}
.....
}
Простите за глупый вопрос (как и говорил Си знаю довольно плохо, т.к. работаю на другом языке программирования)
как его проверить ? куда его можно вывести и какой он должен быть ?
AJD>Здравствуйте, fromtodo, Вы писали:
AJD>Проверь чему у тебя pDisp1 равен