Active Safe

举报
清雨小竹 发表于 2022/09/25 00:58:18 2022/09/25
【摘要】 #include <objsafe.h> // for IObjectSafety; in ActiveX SDK //........................................................................ //ISafeObject DECLARE_INTERFA...

      #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/8265514

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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