zoukankan      html  css  js  c++  java
  • ocx控件避免弹出警告的类--2

    本文与 OCX控件避免弹出安全警告的类 http://www.cnblogs.com/lidabo/archive/2013/03/26/2981852.html 有些类似,只不过增加了几行代码(红色标注)

    1.要加一个头文件:
             #include <objsafe.h>

    2.在控件头文件中加入:

    //////////////////////////////////////////////////////////////////////////
    //安全接口实现
    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);
    //////////////////////////////////////////////////////////////////////////

     


    3.在控件的CPP文件中加入:

    //////////////////////////////////////////////////////////////////////////
    //安全接口实现
    BEGIN_INTERFACE_MAP( CFaceFinderOcxCtrl, COleControl )
    INTERFACE_PART(CFaceFinderOcxCtrl, IID_IObjectSafety, ObjSafe)
    END_INTERFACE_MAP()
    //.............................................................................
    // IObjectSafety member functions
    // Delegate AddRef, Release, QueryInterface
    ULONG FAR EXPORT CFaceFinderOcxCtrl::XObjSafe::AddRef()
    {
    METHOD_PROLOGUE(CFaceFinderOcxCtrl, ObjSafe)
    return pThis->ExternalAddRef();
    }
    ULONG FAR EXPORT CFaceFinderOcxCtrl::XObjSafe::Release()
    {
    METHOD_PROLOGUE(CFaceFinderOcxCtrl, ObjSafe)
    return pThis->ExternalRelease();
    }
    HRESULT FAR EXPORT CFaceFinderOcxCtrl::XObjSafe::QueryInterface(
    REFIID iid, void FAR* FAR* ppvObj)
    {
    METHOD_PROLOGUE(CFaceFinderOcxCtrl, 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
    CFaceFinderOcxCtrl::XObjSafe::GetInterfaceSafetyOptions(
    REFIID riid,
    DWORD __RPC_FAR *pdwSupportedOptions,
    DWORD __RPC_FAR *pdwEnabledOptions)
    {
    METHOD_PROLOGUE(CFaceFinderOcxCtrl, 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
    CFaceFinderOcxCtrl::XObjSafe::SetInterfaceSafetyOptions(
    REFIID riid,
    DWORD dwOptionSetMask,
    DWORD dwEnabledOptions)
    {
    METHOD_PROLOGUE(CFaceFinderOcxCtrl, 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);
    }
    //////////////////////////////////////////////////////////////////////////

    //OK!不会再弹出那个“与ActiveX控件交互不安全“的对话框了~~~

    //其中CFaceFinderOcxCtrl全部要换成你的控件的类名

  • 相关阅读:
    什么是 HTTPS
    首页飘雪的效果
    load data导入数据之csv的用法
    phpcms v9 配置sphinx全文索引教程
    js的一些技巧总结
    MySQL 清除表空间碎片
    使用的前台开发在线工具
    (phpQuery)对网站产品信息采集代码的优化
    永远不要打探别人工资
    git 显示多个url地址推送
  • 原文地址:https://www.cnblogs.com/lidabo/p/3605301.html
Copyright © 2011-2022 走看看