Click to See Complete Forum and Search --> : How to use InterFace?


AirBus
May 20th, 1999, 03:29 AM
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);
}

Dave Lorde
May 20th, 1999, 06:01 AM
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