您的位置:首页 > 其它

MFC ActiveX OCX控件添加安全接口

2013-03-12 14:38 459 查看
XXXXCtrl.h头文件中加入

#include <ObjSafe.h>

DECLARE_INTERFACE_MAP()

BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety);

STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (

REFIID riid,

DWORD __RPC_FAR *pdwSupportedOptions,

DWORD __RPC_FAR *pdwEnabledOptions

);

STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (

REFIID riid,

DWORD dwOptionSetMask,

DWORD dwEnabledOptions

);

END_INTERFACE_PART(ObjSafe);

XXXXCtrl.cpp源文件中加入

BEGIN_INTERFACE_MAP( CXXXXCtrl, COleControl )

INTERFACE_PART( CXXXXCtrl, IID_IObjectSafety, ObjSafe)

END_INTERFACE_MAP()

ULONG FAR EXPORT CXXXXCtrl::XObjSafe::AddRef()

{

METHOD_PROLOGUE( CXXXXCtrl, ObjSafe);

return pThis->ExternalAddRef();

}

ULONG FAR EXPORT CXXXXCtrl::XObjSafe::Release()

{

METHOD_PROLOGUE( CXXXXCtrl, ObjSafe);

return pThis->ExternalRelease();

}

HRESULT FAR EXPORT CXXXXCtrl::XObjSafe::QueryInterface(

REFIID iid, void FAR* FAR* ppvObj)

{

METHOD_PROLOGUE( CXXXXCtrl, ObjSafe);

return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);

}

const DWORD dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;

const DWORD dwNotSupportedBits = ~dwSupportedBits;

//.............................................................................

// CStopLiteCtrl::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

CXXXXCtrl::XObjSafe::GetInterfaceSafetyOptions(

REFIID riid,

DWORD __RPC_FAR *pdwSupportedOptions,

DWORD __RPC_FAR *pdwEnabledOptions)

{

METHOD_PROLOGUE( CXXXXCtrl, 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

}

/////////////////////////////////////////////////////////////////////////////

// CStopLiteCtrl::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

CXXXXCtrl::XObjSafe::SetInterfaceSafetyOptions(

REFIID riid,

DWORD dwOptionSetMask,

DWORD dwEnabledOptions)

{

METHOD_PROLOGUE( CXXXXCtrl, 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);

}

备注:替换CXXXXCtrl为实际的类名
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: