ActiveX控制注册为安全控件

要是ActiveX注册为安全控件,一定要继承IObjectSafety接口

首先,在项目Ctrl.h中引用

#include<objsafe.h>

然后

DECLARE_DYNCREATE(CKBPwdActiveXCtrl) 下面添加如下代码:
    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);
    //---------------------------------------

这个是设置头文件完成,然后在其项目Ctrl.cpp中

在UpdateRegistry上面添加如下代码:

//----------------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//设置注册为安全控件
// Interface map for IObjectSafety

BEGIN_INTERFACE_MAP(CICCardBottomActiveXCtrl, COleControl)

    INTERFACE_PART(CICCardBottomActiveXCtrl, IID_IObjectSafety, ObjSafe)

END_INTERFACE_MAP()

/////////////////////////////////////////////////////////////////////////////

// IObjectSafety member functions

// Delegate AddRef, Release, QueryInterface

ULONG FAR EXPORT CICCardBottomActiveXCtrl::XObjSafe::AddRef()

{

    METHOD_PROLOGUE(CICCardBottomActiveXCtrl, ObjSafe)

        return pThis->ExternalAddRef();

}

ULONG FAR EXPORT CICCardBottomActiveXCtrl::XObjSafe::Release()

{

    METHOD_PROLOGUE(CICCardBottomActiveXCtrl, ObjSafe)

        return pThis->ExternalRelease();

}

HRESULT FAR EXPORT CICCardBottomActiveXCtrl::XObjSafe::QueryInterface(

    REFIID iid, void FAR* FAR* ppvObj)

{

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

CICCardBottomActiveXCtrl::XObjSafe::GetInterfaceSafetyOptions(

REFIID riid,

DWORD __RPC_FAR *pdwSupportedOptions,

DWORD __RPC_FAR *pdwEnabledOptions)

{

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

CICCardBottomActiveXCtrl::XObjSafe::SetInterfaceSafetyOptions(

REFIID riid,

DWORD dwOptionSetMask,

DWORD dwEnabledOptions)

{

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

}


//------------------------------------------------------------------------------------

设置完成。

posted @ 2014-07-02 13:16  聆听的风声  阅读(273)  评论(0)    收藏  举报