ACTIVE控件Safe问题

举报
清雨小竹 发表于 2022/09/25 01:10:12 2022/09/25
【摘要】 #include <objsafe.h> // for IObjectSafety; in ActiveX SDK //........................................................................ //ISafeObject DECLARE_INTE...
#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);
 }

文章来源: zzzili.blog.csdn.net,作者:清雨小竹,版权归原作者所有,如需转载,请联系作者。

原文链接:zzzili.blog.csdn.net/article/details/8265652

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。