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);
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值