日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]ActiveX控件安全初始化之一:实现ISafeObject接口

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]ActiveX控件安全初始化之一:实现ISafeObject接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【轉】自http://www.cnblogs.com/carekee/articles/1772201.html?
ActiveX控件安全初始化之一:實現ISafeObject接口

ActiveX控件打包成cab后,在腳本中調用中時,要保證控件的安全性才能在你的網頁上安全運行,有兩種方法來實現這一保證:實現一個名稱為IObjectSafe的接口到你的控件。如果IE發現你的控件支持IObjectSafety,它調用 IObjectSafety::SetInterfaceSafetyOptions 方法然后才載入你的控件。另外一種方法需要修改注冊表,我將會在另外一篇文章中詳細介紹。

1。創建了一個叫做“tryISafeObject.ocx”的MFC ActiveX控件。

2。在tryISafeObjectCtrl.h中定義ISafeObject接口:

#include <objsafe.h>?// for IObjectSafety; in ActiveX SDK

class CtryISafeObjectCtrl : public COleControl
{

?DECLARE_DYNCREATE(CtryISafeObjectCtrl)
//........................................................................
//ISafeObject
?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);

//ISafeObject
//........................................................................

。。。。。

};

在objsafe.h頭文件中有ISafeObject接口的相關定義

3。在tryISafeObjectCtrl.cpp中ISafeObject接口的相關實現:

//.............................................................................
// Interface map for IObjectSafety

BEGIN_INTERFACE_MAP( CtryISafeObjectCtrl, COleControl )
?INTERFACE_PART(CtryISafeObjectCtrl, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()

//.............................................................................
// IObjectSafety member functions

// Delegate AddRef, Release, QueryInterface

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

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

HRESULT FAR EXPORT CtryISafeObjectCtrl::XObjSafe::QueryInterface(
??? REFIID iid, void FAR* FAR* ppvObj)
{
??? METHOD_PROLOGUE(CtryISafeObjectCtrl, 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?
?CtryISafeObjectCtrl::XObjSafe::GetInterfaceSafetyOptions(?
??/* [in] */ REFIID riid,
??????? /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
??????? /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)
{
?METHOD_PROLOGUE(CtryISafeObjectCtrl, 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?
?CtryISafeObjectCtrl::XObjSafe::SetInterfaceSafetyOptions(?
??????? /* [in] */ REFIID riid,
??????? /* [in] */ DWORD dwOptionSetMask,
??????? /* [in] */ DWORD dwEnabledOptions)
{
??? METHOD_PROLOGUE(CtryISafeObjectCtrl, 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);
}

轉載于:https://www.cnblogs.com/zhb/archive/2012/09/03/2668238.html

總結

以上是生活随笔為你收集整理的[转]ActiveX控件安全初始化之一:实现ISafeObject接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。