MFC dialog + IOleObject->SetClientSite
От: loggik  
Дата: 09.04.18 10:06
Оценка:
Привет всем.

Имеется MFC dialog based приложение с расположенным на диалоге WebBrowser-ом. Для WebBrowser-a возникла задача подстановки прокси с авторизацией. Для этого добавлен отдельный класс CClientClass, в котором реализованы интерфейсы IOleClientSite, IAuthenticate, IServiceProvider. Далее этот класс передается в метод SetClientSite для объекта IOleObject полученного из WebBrowser. Сам процесс авторизации происходит корректно, вызывается метод Authenticate в классе CClientClass, и далее происходит переход на страницы в WebBrowser уже через прокси.
Но возник побочный эффект такой реализации, оказалось что элемент WebBrowser-а перестал обрабатывать нажатия клавиш, т.е. никакие вводы текста в поля уже стали невозможны.
Может кто-то подсказать где чего неправильно, я подозреваю что CClientClass нужно видимо еще что-то добавлять.

Передача CClientClass

if (LPUNKNOWN pUnk = m_Browser.GetControlUnknown())
    {
        if (SUCCEEDED(pUnk->QueryInterface(IID_IWebBrowser2, (void**)&piWebBrowser2)))
        {
            hr = piWebBrowser2->QueryInterface(IID_IOleObject, (void**)&pOleObject);
        }
    }
    if (pOleObject){
        hr = pOleObject->SetClientSite((IOleClientSite*)&m_client);
    }



хидер CClientClass

#include "mshtmhst.h"

class CClientClass: 
    public IOleClientSite, IAuthenticate, IServiceProvider
{
public:
    CClientClass(void){}
    ~CClientClass(void){}

//IUnknown
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG) Release();
    STDMETHODIMP QueryInterface(REFIID riid, void** ppv);

//IOleClientSite
    STDMETHODIMP SaveObject( void){ return E_NOTIMPL; }

    STDMETHODIMP GetMoniker( 
        /* [in] */ DWORD dwAssign,
        /* [in] */ DWORD dwWhichMoniker,
        /* [out] */ IMoniker **ppmk){ return E_NOTIMPL; }

    STDMETHODIMP GetContainer( 
        /* [out] */ IOleContainer **ppContainer){ return E_NOTIMPL; }

    STDMETHODIMP ShowObject(void){ MessageBox(NULL, "ShowObject", "container", MB_OK); return S_OK ;}

    STDMETHODIMP OnShowWindow( 
        /* [in] */ BOOL fShow){return S_OK;}

    STDMETHODIMP RequestNewObjectLayout( void){ return E_NOTIMPL; }


    //IServiceProvider
    STDMETHODIMP QueryService(REFGUID guid, REFIID iid, LPVOID * ppv);


    //IAuthenticate
    STDMETHODIMP Authenticate(HWND __RPC_FAR *phwnd, LPWSTR __RPC_FAR *pszUsername, LPWSTR __RPC_FAR *pszPassword);

};



Благодарю за помощь.
Re: MFC dialog + IOleObject->SetClientSite
От: Carc Россия https://vk.com/gosha_mazov
Дата: 09.04.18 12:02
Оценка:
Здравствуйте, loggik, Вы писали:

L>Привет всем.

L>Но возник побочный эффект такой реализации, оказалось что элемент WebBrowser-а перестал обрабатывать нажатия клавиш, т.е. никакие вводы текста в поля уже стали невозможны.
L>Может кто-то подсказать где чего неправильно, я подозреваю что CClientClass нужно видимо еще что-то добавлять.

L>Благодарю за помощь.

Ну а метод IAuthenticate::Authenticate вызывается или нет?
Aml Pages Home
Re[2]: MFC dialog + IOleObject->SetClientSite
От: loggik  
Дата: 09.04.18 14:56
Оценка:
Здравствуйте, Carc, Вы писали:

C>Здравствуйте, loggik, Вы писали:


L>>Привет всем.

L>>Но возник побочный эффект такой реализации, оказалось что элемент WebBrowser-а перестал обрабатывать нажатия клавиш, т.е. никакие вводы текста в поля уже стали невозможны.
L>>Может кто-то подсказать где чего неправильно, я подозреваю что CClientClass нужно видимо еще что-то добавлять.

L>>Благодарю за помощь.

C>Ну а метод IAuthenticate::Authenticate вызывается или нет?

С этим все в порядке.
Метод Authenticate вызывается, и в нем реализуется передача логин/пасс, и далее происходит авторизация на прокси сервере. т.е. WebBrowser заходит на страницы уже через прокси,
но по всей видимости реализация CClientClass неполная, т.к. часть функций самого WebBrowser-а не срабатывают.

В CClientClass приходят запросы на дополнительные интерфейсы, в частности IOleInPlaceSite, может его тоже нужно реализовывать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.