Active Safe

简介: Active Safe
#include <objsafe.h> // for IObjectSafety; in ActiveX SDK 
//........................................................................
 //ISafeObject
 DECLARE_INTERFACE_MAP()
 BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
  STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) ( 
  /* [in] */ REFIID riid,
  /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
  /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions
  );
  STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) ( 
   /* [in] */ REFIID riid,
   /* [in] */ DWORD dwOptionSetMask,
   /* [in] */ DWORD dwEnabledOptions
   );
 END_INTERFACE_PART(ObjSafe);
///
//.............................................................................
 // Interface map for IObjectSafety
 BEGIN_INTERFACE_MAP( CCameraACXCtrl, COleControl )
  INTERFACE_PART(CCameraACXCtrl, IID_IObjectSafety, ObjSafe)
 END_INTERFACE_MAP()
 //.............................................................................
 // IObjectSafety member functions
 // Delegate AddRef, Release, QueryInterface
 ULONG FAR EXPORT CCameraACXCtrl::XObjSafe::AddRef()
 {
  METHOD_PROLOGUE(CCameraACXCtrl, ObjSafe)
   return pThis->ExternalAddRef();
 }
 ULONG FAR EXPORT CCameraACXCtrl::XObjSafe::Release()
 {
  METHOD_PROLOGUE(CCameraACXCtrl, ObjSafe)
   return pThis->ExternalRelease();
 }
 HRESULT FAR EXPORT CCameraACXCtrl::XObjSafe::QueryInterface(
  REFIID iid, void FAR* FAR* ppvObj)
 {
  METHOD_PROLOGUE(CCameraACXCtrl, 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 
  CCameraACXCtrl::XObjSafe::GetInterfaceSafetyOptions( 
  /* [in] */ REFIID riid,
  /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
  /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)
 {
  METHOD_PROLOGUE(CCameraACXCtrl, 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 
  CCameraACXCtrl::XObjSafe::SetInterfaceSafetyOptions( 
  /* [in] */ REFIID riid,
  /* [in] */ DWORD dwOptionSetMask,
  /* [in] */ DWORD dwEnabledOptions)
 {
  METHOD_PROLOGUE(CCameraACXCtrl, 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);
 }
相关文章
|
11月前
|
网络协议 安全 数据安全/隐私保护
Active Directory与域服务,介绍,安装(下)
Active Directory与域服务,介绍,安装
119 0
|
11月前
|
负载均衡 安全 网络协议
Active Directory与域服务,介绍,安装(上)
Active Directory与域服务,介绍,安装
237 0
ACTIVE控件Safe问题
ACTIVE控件Safe问题
55 0
Safe Area解析
Safe Area解析(一) —— Safe Area由来及简单使用(一)Safe Area解析(二) —— 你为什么并不safe?(一)
829 0