Active Safe
【摘要】
#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)