VC6.0 MFC方式的OCX 去除安全警告框

1、在XXXCtl.h 中加入以下内容

#if !defined(AFX_XXXCTL_H__A4724BE9_A262_471D_ADF2_3BFE587B7078__INCLUDED_) #define AFX_XXXCTL_H__A4724BE9_A262_471D_ADF2_3BFE587B7078__INCLUDED_

#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000

// XXXCtl.h : Declaration of the CXXXCtrl ActiveX Control class.

/ // CXXXCtrl : See XXXCtl.cpp for implementation. #include <objsafe.h>  //去IE安全检测

class CXXXCtrl : public COleControl {  DECLARE_DYNCREATE(CXXXCtrl)  DECLARE_INTERFACE_MAP()   BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)//去IE安全检测  STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (//去IE安全检测   REFIID riid,   DWORD __RPC_FAR *pdwSupportedOptions,   DWORD __RPC_FAR *pdwEnabledOptions   );    STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (//去IE安全检测   REFIID riid,   DWORD dwOptionSetMask,   DWORD dwEnabledOptions   );  END_INTERFACE_PART(ObjSafe);//去IE安全检测  

// Constructor public:  CXXXCtrl();

// Overrides  // ClassWizard generated virtual function overrides  //{{AFX_VIRTUAL(CXXXCtrl)  public:  virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);  virtual void DoPropExchange(CPropExchange* pPX);  virtual void OnResetState();  //}}AFX_VIRTUAL

// Implementation protected:  ~CXXXCtrl();

 DECLARE_OLECREATE_EX(CXXXCtrl)    // Class factory and guid  DECLARE_OLETYPELIB(CXXXCtrl)      // GetTypeInfo  DECLARE_PROPPAGEIDS(CXXXCtrl)     // Property page IDs  DECLARE_OLECTLTYPE(CXXXCtrl)   // Type name and misc status

// Message maps  //{{AFX_MSG(CXXXCtrl)   // NOTE - ClassWizard will add and remove member functions here.   //    DO NOT EDIT what you see in these blocks of generated code !  //}}AFX_MSG  DECLARE_MESSAGE_MAP()

// Dispatch maps  //{{AFX_DISPATCH(CXXXCtrl)   // NOTE - ClassWizard will add and remove member functions here.   //    DO NOT EDIT what you see in these blocks of generated code !   //}}AFX_DISPATCH  DECLARE_DISPATCH_MAP()

// Event maps  //{{AFX_EVENT(CXXXCtrl)   // NOTE - ClassWizard will add and remove member functions here.   //    DO NOT EDIT what you see in these blocks of generated code !  //}}AFX_EVENT  DECLARE_EVENT_MAP()

// Dispatch and event IDs public:  enum {  //{{AFX_DISP_ID(CXXXCtrl)   // NOTE: ClassWizard will add and remove enumeration elements here.   //    DO NOT EDIT what you see in these blocks of generated code !  //}}AFX_DISP_ID  }; };

//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_XXXCTL_H__A4724BE9_A262_471D_ADF2_3BFE587B7078__INCLUDED)

2、在GnGenralHandlerCtl.cpp中加入如下内容,对比发下内容在相关位置添加代码

IMPLEMENT_OLECTLTYPE(CXXXCtrl, IDS_XXX, _dwXXXOleMisc)


/
// Interface map for IObjectSafety

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

/
// IObjectSafety member functions

// Delegate AddRef, Release, QueryInterface

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

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

HRESULT FAR EXPORT CXXXCtrl::XObjSafe::QueryInterface(
    REFIID iid, void FAR* FAR* ppvObj)
{
    METHOD_PROLOGUE(CXXXCtrl, ObjSafe)
    return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}

const DWORD dwSupportedBits =
  INTERFACESAFE_FOR_UNTRUSTED_CALLER |
  INTERFACESAFE_FOR_UNTRUSTED_DATA;
const DWORD dwNotSupportedBits = ~dwSupportedBits;
 
/
// CXXXCtrl::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 CXXXCtrl::XObjSafe::GetInterfaceSafetyOptions(
		REFIID riid,
        DWORD __RPC_FAR *pdwSupportedOptions,
        DWORD __RPC_FAR *pdwEnabledOptions)
{
	METHOD_PROLOGUE(CGnGenralHandlerCtrl, 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
}

/
// CXXXCtrl::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 CXXXCtrl::XObjSafe::SetInterfaceSafetyOptions(
        REFIID riid,
        DWORD dwOptionSetMask,
        DWORD dwEnabledOptions)
{
    METHOD_PROLOGUE(CXXXCtrl, 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);
}
/
// CXXXCtrl::CXXXCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CXXXCtrl

BOOL CXXXrCtrl::CXXXCtrlFactory::UpdateRegistry(BOOL bRegister)
{
	// TODO: Verify that your control follows apartment-model threading rules.
	// Refer to MFC TechNote 64 for more information.
	// If your control does not conform to the apartment-model rules, then
	// you must modify the code below, changing the 6th parameter from
	// afxRegApartmentThreading to 0.

	if(bRegister)
	{
		return AfxOleRegisterControlClass(
			AfxGetInstanceHandle(),
			m_clsid,
			m_lpszProgID,
			IDS_GNGENRALHANDLER, 
			IDB_GNGENRALHANDLER, 
			afxRegApartmentThreading,
			_dwGnGenralHandlerOleMisc,
			_tlid,
			_wVerMajor,
			_wVerMinor);
	}
	else
	{
		return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
	}
}


/
// CXXXCtrl::CXXXCtrl - Constructor

      按以上添加就可以去除IE的安全警告框

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值