Invoke и beforenavigate2 нужна помощь
От: fromtodo  
Дата: 18.01.07 18:28
Оценка:
Приветствую,
перерыл весь 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.
Но как мне его получить ? Как получить код главного окна и фрэймов ?
Я не силен в С, точнее практически не знаю его, собирал код интуитивно, все работает, осталась только проблема с фрэймами.
Помогите пожалуйста кусочком кода !
Re: Invoke и beforenavigate2 нужна помощь
От: fromtodo  
Дата: 18.01.07 21:12
Оценка:
При использовании этого кода, все компилируется, но при запуске IE вышибает
CComQIPtr<IWebBrowser2> pWeb(pDisp);

VARIANT_BOOL vb = VARIANT_FALSE;
if(SUCCEEDED(pWeb->get_TopLevelContainer(&vb))){
if(vb == VARIANT_FALSE)
return;
}
Re[2]: Invoke и beforenavigate2 нужна помощь
От: Vi2 Удмуртия http://www.adem.ru
Дата: 19.01.07 05:30
Оценка:
Здравствуйте, 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?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Invoke и beforenavigate2 нужна помощь
От: fromtodo  
Дата: 19.01.07 11:37
Оценка:
Здравствуйте, 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);

   }
.....
}
Re[4]: Invoke и beforenavigate2 нужна помощь
От: AndrewJD США  
Дата: 19.01.07 12:31
Оценка:
Здравствуйте, fromtodo, Вы писали:

Проверь чему у тебя pDisp1 равен
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[5]: Invoke и beforenavigate2 нужна помощь
От: fromtodo  
Дата: 20.01.07 12:56
Оценка:
Простите за глупый вопрос (как и говорил Си знаю довольно плохо, т.к. работаю на другом языке программирования)
как его проверить ? куда его можно вывести и какой он должен быть ?
AJD>Здравствуйте, fromtodo, Вы писали:

AJD>Проверь чему у тебя pDisp1 равен
Re[6]: Invoke и beforenavigate2 нужна помощь
От: AndrewJD США  
Дата: 20.01.07 20:07
Оценка:
Здравствуйте, fromtodo, Вы писали:

AJD>>Проверь чему у тебя pDisp1 равен

F>как его проверить ? куда его можно вывести и какой он должен быть ?

Я имею ввиду проверь на NULL. CComQIPtr нельзя подавать на вход нулевые указатели
"For every complex problem, there is a solution that is simple, neat,
and wrong."
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.