MFC ActiveX OCX控件添加安全接口

XXXXCtrl.h头文件中加入


#include <ObjSafe.h>


DECLARE_INTERFACE_MAP()
    BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety);
    STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (
        REFIID riid,
        DWORD __RPC_FAR *pdwSupportedOptions,
        DWORD __RPC_FAR *pdwEnabledOptions
        );
    STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (
        REFIID riid,
        DWORD dwOptionSetMask,
        DWORD dwEnabledOptions
        );
    END_INTERFACE_PART(ObjSafe);


XXXXCtrl.cpp源文件中加入


BEGIN_INTERFACE_MAP(  CXXXXCtrl, COleControl )
    INTERFACE_PART( CXXXXCtrl, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()


ULONG FAR EXPORT  CXXXXCtrl::XObjSafe::AddRef()
{
    METHOD_PROLOGUE( CXXXXCtrl, ObjSafe);
    return pThis->ExternalAddRef();
}


ULONG FAR EXPORT  CXXXXCtrl::XObjSafe::Release()
{
    METHOD_PROLOGUE( CXXXXCtrl, ObjSafe);
    return pThis->ExternalRelease();
}


HRESULT FAR EXPORT  CXXXXCtrl::XObjSafe::QueryInterface(
    REFIID iid, void FAR* FAR* ppvObj)
{
    METHOD_PROLOGUE( CXXXXCtrl, 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

 CXXXXCtrl::XObjSafe::GetInterfaceSafetyOptions(

    REFIID riid,

    DWORD __RPC_FAR *pdwSupportedOptions,

    DWORD __RPC_FAR *pdwEnabledOptions)

{

    METHOD_PROLOGUE( CXXXXCtrl, 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

 CXXXXCtrl::XObjSafe::SetInterfaceSafetyOptions(

    REFIID riid,

    DWORD dwOptionSetMask,

    DWORD dwEnabledOptions)

{

    METHOD_PROLOGUE( CXXXXCtrl, 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);
}


备注:替换CXXXXCtrl为实际的类名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值