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);
 }
相关文章
20avalon - 指令ms-active(active绑定)
20avalon - 指令ms-active(active绑定)
45 0
|
前端开发 JavaScript
设置控件不能点击(pointer-events)
设置控件不能点击(pointer-events)
59 0
|
负载均衡 安全 网络协议
Active Directory与域服务,介绍,安装(上)
Active Directory与域服务,介绍,安装
323 0
|
网络协议 安全 数据安全/隐私保护
Active Directory与域服务,介绍,安装(下)
Active Directory与域服务,介绍,安装
179 0
The Soft Link between IM Level Storage Location and WM level Storage Type?(2)
The Soft Link between IM Level Storage Location and WM level Storage Type?(2)
The Soft Link between IM Level Storage Location and WM level Storage Type?(2)
The Soft Link between IM Level Storage Location and WM level Storage Type?(1)
The Soft Link between IM Level Storage Location and WM level Storage Type?(1)
The Soft Link between IM Level Storage Location and WM level Storage Type?(1)