SOL9 2.0 Class: OleSite

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * OleSite.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


/**
This is a simple Win32 C++ class (not MFC and WTL) to embed a IE browser control 
(an OLE object) or something like that into your own window.
Basically, this is based on a C++ example written by Chris Becke.
For C version, see http://www.codeproject.com/com/cwebpage.asp.
*/

// SOL9
// 2008/08/10
// 2011/02/21 Updated

#pragma once

#include <sol\Object.h>

#include <exdisp.h>
#include <sol\ole\IHTMLView.h>
#include <oleidl.h>
#include <sol/Stdio.h>

namespace SOL {

/**
 * Implementation of IOleClientSite and IOleInPlaceSite interfaces.
 */
class COleSite: public IOleClientSite, public IOleInPlaceSite {
    
public:
    Composite* host;    //2011/02/21 Modified 

public:
    COleSite()
        :host(NULL)
    {
    }

public:
    //
    // IOleSite
    //
    STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObject)
    {
        if(riid == IID_IDispatch) {
            *ppvObject = (IDispatch*)this;
        }
        if(riid == IID_IUnknown || riid == IID_IOleClientSite) {
            *ppvObject = (IOleClientSite*)this;
        }
        else if(riid == IID_IOleInPlaceSite ) {
            *ppvObject = (IOleInPlaceSite*)this;
        } else if (riid == IID_IOleInPlaceActiveObject ) { //2011/02/23
            *ppvObject = (IOleInPlaceActiveObject*)this;

        } else{
            *ppvObject = NULL;
            return E_NOINTERFACE;
        }
        return S_OK;
    }

    STDMETHODIMP_(ULONG) AddRef(void){
        return 1;
    }


    STDMETHODIMP_(ULONG) Release(void){
        return 1;
    }


// IOleClientSite

    STDMETHODIMP SaveObject(){    
        return E_NOTIMPL;
    }

    STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk) {
        return E_NOTIMPL;
    }


    STDMETHODIMP GetContainer(LPOLECONTAINER FAR* ppContainer){
        // Don't support a container.
        *ppContainer = NULL;
        return E_NOTIMPL;
    }


    STDMETHODIMP ShowObject() {
        //  ;
        return NOERROR;
    }

    STDMETHODIMP OnShowWindow(BOOL fShow){
        return E_NOTIMPL;
    }


    STDMETHODIMP RequestNewObjectLayout(){
        return E_NOTIMPL;
    }

// IOleWindow

    STDMETHODIMP GetWindow(HWND FAR* lphwnd) {
        *lphwnd = NULL;
        if (host) {
            *lphwnd = host->getWindow();
        }
        return S_OK;
    }

    STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode){
        return E_NOTIMPL;
    }

// IOleInPlaceSite

    STDMETHODIMP CanInPlaceActivate() {
    // Yes we can
        return S_OK;
    }

    STDMETHODIMP OnInPlaceActivate() {
         return S_OK;
    }

    STDMETHODIMP OnUIActivate(){
        return S_OK;
    }

    STDMETHODIMP GetWindowContext(
        LPOLEINPLACEFRAME FAR* ppFrame,
        LPOLEINPLACEUIWINDOW FAR* ppDoc,
        LPRECT prcPosRect,
        LPRECT prcClipRect,
        LPOLEINPLACEFRAMEINFO lpFrameInfo)
    {
        HWND hwnd = NULL ;//host->getWindow();
        *ppFrame = NULL; //host->getInPlaceFrame();    
        if (host) {
            hwnd = host->getWindow();
            *ppFrame = host->getInPlaceFrame();    
        }

        *ppDoc = NULL;

        GetClientRect(hwnd, prcPosRect);
        GetClientRect(hwnd, prcClipRect);

        lpFrameInfo->fMDIApp = FALSE;

        lpFrameInfo->hwndFrame = hwnd;
        lpFrameInfo->haccel = NULL;
        lpFrameInfo->cAccelEntries = 0;
        return S_OK;
    }


    STDMETHODIMP Scroll(SIZE scrollExtent){
        return E_NOTIMPL;
    }

    STDMETHODIMP OnUIDeactivate(BOOL fUndoable){
        return S_OK;
    }

    STDMETHODIMP OnInPlaceDeactivate(){
        return S_OK;
    }

    STDMETHODIMP DiscardUndoState(){
        return E_NOTIMPL;
    }

    STDMETHODIMP DeactivateAndUndo(){
        return E_NOTIMPL;
    }

    STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect)
    {
        //2008/08/05: to-arai
        IOleInPlaceObject* inplace =NULL;
        HRESULT hr = E_FAIL;
        if (host) {
            IOleObject* oleObject = host->getOleObject();
            if (oleObject) {
                if (!oleObject->QueryInterface(IID_IOleInPlaceObject, (void**)&inplace)) {
                    hr = inplace->SetObjectRects(lprcPosRect, lprcPosRect);
                }
            }
        }
        return hr;
    }


};

}

Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.