Привет всем.
Имеется 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);
};
Благодарю за помощь.
Здравствуйте, loggik, Вы писали:
L>Привет всем.
L>Но возник побочный эффект такой реализации, оказалось что элемент WebBrowser-а перестал обрабатывать нажатия клавиш, т.е. никакие вводы текста в поля уже стали невозможны.
L>Может кто-то подсказать где чего неправильно, я подозреваю что CClientClass нужно видимо еще что-то добавлять.
L>Благодарю за помощь.
Ну а метод
IAuthenticate::Authenticate вызывается или нет?
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, loggik, Вы писали:
L>>Привет всем.
L>>Но возник побочный эффект такой реализации, оказалось что элемент WebBrowser-а перестал обрабатывать нажатия клавиш, т.е. никакие вводы текста в поля уже стали невозможны.
L>>Может кто-то подсказать где чего неправильно, я подозреваю что CClientClass нужно видимо еще что-то добавлять.
L>>Благодарю за помощь.
C>Ну а метод IAuthenticate::Authenticate вызывается или нет?
С этим все в порядке.
Метод Authenticate вызывается, и в нем реализуется передача логин/пасс, и далее происходит авторизация на прокси сервере. т.е. WebBrowser заходит на страницы уже через прокси,
но по всей видимости реализация CClientClass неполная, т.к. часть функций самого WebBrowser-а не срабатывают.
В CClientClass приходят запросы на дополнительные интерфейсы, в частности IOleInPlaceSite, может его тоже нужно реализовывать.