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);
 }
相关文章
|
4月前
|
存储 网络协议 网络安全
什么是 Active Directory?
【8月更文挑战第4天】
254 10
|
数据库
loading local data is disabled; this must be enabled on both the client and server sides
loading local data is disabled; this must be enabled on both the client and server sides
183 0
|
负载均衡 安全 网络协议
Active Directory与域服务,介绍,安装(上)
Active Directory与域服务,介绍,安装
324 0
|
网络协议 安全 数据安全/隐私保护
Active Directory与域服务,介绍,安装(下)
Active Directory与域服务,介绍,安装
179 0
|
网络安全 开发工具
【解决方案】A session ended very soon after starting. Check that the command in profile “XXX” is correct.
【解决方案】A session ended very soon after starting. Check that the command in profile “XXX” is correct.
1041 0
【解决方案】A session ended very soon after starting. Check that the command in profile “XXX” is correct.
ACTIVE控件Safe问题
ACTIVE控件Safe问题
70 0
|
存储 网络协议 数据安全/隐私保护