Как обрабатывать IHttpSecurity :: OnSecurityProblem, имеющий объект IWebBrowser2 - PullRequest
2 голосов
/ 17 августа 2010

Я не могу понять, как передать свою реализацию IHttpSecurity :: OnSecurityProblem моему объекту IWebBrowser2.

Я знаю, что мне нужно реализовать класс примерно так:

class CServiceProvider : public IServiceProvider
{
public:
CServiceProvider();
~CServiceProvider(); 

    // IUnknown
    ULONG STDMETHODCALLTYPE AddRef();
    ULONG STDMETHODCALLTYPE Release();
    STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject);

//QueryService
STDMETHODIMP QueryService(REFGUID guidService,REFIID riid,void **ppv);

private:
 ULONG m_ulRefCnt;
};

И в функции QueryService, когда она запрашивает IID_IHttpSecurity, я возвращаю свою реализацию интерфейса IHttpSecurity.

Но моя проблема в том, как настроить реализацию поставщика услуг для объекта IWebBrowser2 и когда?

Мой код выглядит примерно так:

IWebBrowser2 * _Browser;

IServiceProvider* pServiceProvider = NULL;
    _Browser->QueryInterface(
                IID_IServiceProvider, 
                (void**)&pServiceProvider);

    IHttpSecurity* pi;
    pServiceProvider->QueryService(IID_IHttpSecurity, &pi);


    _Browser->Navigate(url.AllocSysString(),
                       &flags,
                       &target_frame_name,
                       &post_data,
                       &headers);

Вопрос, который работает так, будто я думаю: если да, то как мне это сделать, а если нет, то можете ли вы объяснить, как это работает и может быть установлено?

PS: я только хочу реализовать интерфейс IID_IHttpSecurity, все остальные интерфейсы, запрашиваемые в QueryService, должны выполнять реализацию по умолчанию, предоставляемую системой ...

Спасибо

Ответы [ 2 ]

3 голосов
/ 17 августа 2010

Я уже выясняю, как это сделать.

Используя MFC, нам нужно только реализовать CCustomOccManager, который реализует COccManager, в то время как реализация функции CreateSite возвращает реализацию нашего COleControlSite (например, CCustomControlSite).В этом классе вам нужно будет переопределить хотя бы функцию QueryService интерфейса IServiceProvider и в этой реализации предоставить вашу реализацию IHttpSecurity (когда этого требует интерфейс).

В конце мы регистрируем все это в приложении InitInstance.используя функцию MFC AfxEnableControlContainer.

Код:

// declare our custom control site to serve as the client site
class CCustomControlSite:public COleControlSite
{
public:
    // constructor associates this site with the container
    CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){}
protected:
DECLARE_INTERFACE_MAP();
BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider)
// declare the interface method(s)
STDMETHOD(QueryService) ( 
            /* [in] */ REFGUID guidService,
            /* [in] */ REFIID riid,
            /* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
END_INTERFACE_PART(ServiceProvider)
};

// declare our control container manager
class CCustomOccManager :public COccManager
{
public:
    CCustomOccManager(){}
    // creates an instance of our custom control site and associates it with the container
    COleControlSite* CreateSite(COleControlContainer* pCtrlCont)
    {
        CCustomControlSite *pSite = new CCustomControlSite(pCtrlCont);
        return pSite;
    }
};

В приложении InitInstance просто вызовите AfxEnableControlContainer для нашей реализации:

// Create a custom control container manager class so we can overide the client site
CCustomOccManager *pMgr = new CCustomOccManager;

// Set our control containment up but using our control container 
// management class instead of MFC's default
AfxEnableControlContainer(pMgr);

Если кто-то обладает знаниями о том, какэто делается без использования MFC, пожалуйста, дайте мне знать.

Спасибо

0 голосов
/ 17 августа 2010

Судя по замечаниям в документации для IServiceProvider, похоже, что ваш объект IOleClientSite должен реализовать IServiceProvider.

...