CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2
  1. #1
    Join Date
    May 1999
    Posts
    23

    How to use InterFace?

    In my MFC ActiveX Control, I can use the
    IObjectSafety interface, but i can't use the IOleInPlaceActiveObject interface, like this:
    DECLARE_INTERFACE_MAP()
    BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
    STDMETHOD_(HRESULT, InterfaceSafetyOptions) (
    /* [in] */ REFIID riid,
    /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
    /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions
    );

    STDMETHOD_(HRESULT, InterfaceSafetyOptions) (
    /* [in] */ REFIID riid,
    /* [in] */ DWORD dwOptionSetMask,
    /* [in] */ DWORD dwEnabledOptions
    );
    END_INTERFACE_PART(ObjSafe);


    BEGIN_INTERFACE_PART(ObjInPlaceActive, IOleInPlaceActiveObject)
    STDMETHOD_(HRESULT, TranslateAccelerator) (
    LPMSG lpmsg
    );

    STDMETHOD_(HRESULT, GetWindow) (
    HWND * phwnd
    );

    STDMETHOD_(HRESULT, ContextSensitiveHelp) (
    BOOL fEnterMode
    );

    STDMETHOD_(HRESULT, OnFrameWindowActivate) (
    BOOL fActivate
    );

    STDMETHOD_(HRESULT, OnDocWindowActivate) (
    BOOL fActivate //State of MDI child document window
    );

    STDMETHOD_(HRESULT, ResizeBorder) (
    LPCRECT prcBorder,
    IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
    BOOL fFrameWindow
    );

    STDMETHOD_(HRESULT, EnableModeless) (
    BOOL fEnable
    );
    END_INTERFACE_PART(ObjInPlaceActive);
    define in mycontrol.h
    In mymycontrol.cpp
    Code like this:
    BEGIN_INTERFACE_MAP( CMyControl, COleControl )
    INTERFACE_PART(CMyControl, IID_IObjectSafety, ObjSafe)
    INTERFACE_PART(CMyControl, IID_IOleInPlaceActiveObject, ObjInPlaceActive)
    END_INTERFACE_MAP()

    const DWORD dwSupportedBits =
    INTERFACESAFE_FOR_UNTRUSTED_CALLER |
    INTERFACESAFE_FOR_UNTRUSTED_DATA;
    const DWORD dwNotSupportedBits = ~ dwSupportedBits;

    /////////////////////////////////////////////////////////////////////////////
    // CMyControl::XObjSafe::GetInterfaceSafetyOptions
    // Allows container to query what interfaces are safe for what. We're
    // optimizing significantly by ignoring which interface the caller is
    // asking for.
    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjSafe::GetInterfaceSafetyOptions(
    /* [in] */ REFIID riid,
    /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
    /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)
    {
    METHOD_PROLOGUE(CMyControl, ObjSafe)

    HRESULT retval = ResultFromScode(S_OK);

    // Does interface exist?
    IUnknown FAR* punkInterface;
    retval = pThis->ExternalQueryInterface(&riid,
    (void * *)&punkInterface);
    if (retval != E_NOINTERFACE) { // interface exists
    punkInterface->Release(); // release it¡ªjust checking!
    }

    // We support both kinds of safety and have always both set,
    // regardless of interface.
    *pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;
    return retval; // E_NOINTERFACE if QI failed
    }

    /////////////////////////////////////////////////////////////////////////////
    // CMyControl::XObjSafe::SetInterfaceSafetyOptions
    // Since we're always safe, this is a no-brainer¡ªbut we do check to make
    // sure the interface requested exists and that the options we're asked to
    // set exist and are set on (we don't support unsafe mode).
    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjSafe::SetInterfaceSafetyOptions(
    /* [in] */ REFIID riid,
    /* [in] */ DWORD dwOptionSetMask,
    /* [in] */ DWORD dwEnabledOptions)
    {
    METHOD_PROLOGUE(CMyControl, ObjSafe)

    // Does interface exist?
    IUnknown FAR* punkInterface;
    pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
    if (punkInterface) { // interface exists
    punkInterface->Release(); // release it¡ªjust checking!
    }
    else { // Interface doesn't exist.
    return ResultFromScode(E_NOINTERFACE);
    }
    // Can't set bits we don't support.
    if (dwOptionSetMask & dwNotSupportedBits) {
    return ResultFromScode(E_FAIL);
    }

    // Can't set bits we do support to zero
    dwEnabledOptions &= dwSupportedBits;
    // (We already know there are no extra bits in mask. )
    if ((dwOptionSetMask & dwEnabledOptions) !=
    dwOptionSetMask) {
    return ResultFromScode(E_FAIL);
    }

    // Don't need to change anything since we're always safe.
    return ResultFromScode(S_OK);
    }

    /////////////////////////////////////////////////////////////////////////////
    // IObjectSafety member functions
    // Delegate AddRef, Release, QueryInterface
    ULONG FAR EXPORT CMyControl::XObjSafe::AddRef()
    {
    METHOD_PROLOGUE(CMyControl, ObjSafe)
    return pThis->ExternalAddRef();
    }

    ULONG FAR EXPORT CMyControl::XObjSafe::Release()
    {
    METHOD_PROLOGUE(CMyControl, ObjSafe)
    return pThis->ExternalRelease();
    }

    HRESULT FAR EXPORT CMyControl::XObjSafe::QueryInterface(
    REFIID iid, void FAR* FAR* ppvObj)
    {
    METHOD_PROLOGUE(CMyControl, ObjSafe)
    return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
    }


    /////////////////////////////////////////////////////////////////////////////
    // CMyControl::XObjInPlaceActive::SetInterfaceSafetyOptions
    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjInPlaceActive::TranslateAccelerator(
    LPMSG lpmsg )
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    if(lpmsg->message == WM_KEYDOWN &&
    (lpmsg->wParam == VK_LEFT ||
    lpmsg->wParam == VK_RIGHT ||
    lpmsg->wParam == VK_UP ||
    lpmsg->wParam == VK_DOWN ||
    lpmsg->wParam == VK_HOME ||
    lpmsg->wParam == VK_END ||
    lpmsg->wParam == VK_NEXT ||
    lpmsg->wParam == VK_PRIOR))
    {
    return S_FALSE;
    }
    //TODO: Add your additional accelerator handling code here
    return S_OK;
    }

    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjInPlaceActive::GetWindow(
    HWND * phwnd
    )
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return S_OK;
    }

    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjInPlaceActive::ContextSensitiveHelp(
    BOOL fEnterMode
    )
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return S_OK;
    }

    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjInPlaceActive::OnFrameWindowActivate(
    BOOL fActivate
    )
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return S_OK;
    }

    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjInPlaceActive::OnDocWindowActivate(
    BOOL fActivate //State of MDI child document window
    )
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return S_OK;
    }

    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjInPlaceActive::ResizeBorder (
    LPCRECT prcBorder,
    IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
    BOOL fFrameWindow
    )
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return S_OK;
    }

    HRESULT STDMETHODCALLTYPE
    CMyControl::XObjInPlaceActive::EnableModeless(
    BOOL fEnable
    )
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return S_OK;
    }
    /////////////////////////////////////////////////////////////////////////////
    // IOleInPlaceActiveObject member functions
    // Delegate AddRef, Release, QueryInterface
    ULONG FAR EXPORT CMyControl::XObjInPlaceActive::AddRef()
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return pThis->ExternalAddRef();
    }

    ULONG FAR EXPORT CMyControl::XObjInPlaceActive::Release()
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return pThis->ExternalRelease();
    }

    HRESULT FAR EXPORT CMyControl::XObjInPlaceActive::QueryInterface(
    REFIID iid, void FAR* FAR* ppvObj)
    {
    METHOD_PROLOGUE(CMyControl, ObjInPlaceActive)
    return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
    }





  2. #2
    Join Date
    Apr 1999
    Posts
    383

    Re: How to use InterFace?

    I think you'd get a better response if you described the problem and the symptoms you are getting. Few people are prepared to wade through all that code on the offchance of spotting a mistake.

    Dave


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured