MFC ActiveX OCX控件添加安全接口
2013-03-12 14:38
459 查看
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为实际的类名
#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为实际的类名
相关文章推荐
- 使用VS2010开发ActiveX(MFC)控件(3)——添加接口及WEB调用
- 使用VS2010开发ActiveX(MFC)控件(3)——添加接口及WEB调用
- 使用VS2010开发ActiveX(MFC)控件(3)——添加接口及WEB调用
- ActiveX(MFC)控件——添加接口及WEB调用
- OCX控件强行注册+可信任站点添加+可信任站点ActiveX安全设置启用+收藏夹
- 使用VS2010开发ActiveX(MFC)控件(3)——添加接口及WEB调用
- 使用VS2010开发ActiveX(MFC)控件(3)——添加接口及WEB调用
- vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
- mfc笔记——控件ocx的添加
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
- MFC ActiveX (ocx)控件的开发
- MFC OCX控件实现安全初始化和脚本安全的方法http://blog.csdn.net/xiliang_pan/article/details/8264685
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
- [activeX]VC2005开发MFC ActiveX ocx控件全过程[转]
- VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程