您的位置:首页 > 其它

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

2013-11-22 15:29 127 查看
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的安全警告框
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: