天天看点

ATL 实现IObjectSafety接口

在 实现IObjectSafety接口之后,浏览器就不会再弹出是否允许运行之类的对话框,MFC ACTIVEX控件中添加IObjectSafety接口是直接实现其中的某些方法,而ATL对IObjectSafety接口做了一个简单的实现,是用 template实现的, template <class T, DWORD dwSupportedSafety>

class IObjectSafetyImpl,见 http://msdn2.microsoft.com/en-us/library/zh7ka3c2.aspx 所以在ATL中可以直接继承这个类就等于实现了IObjectSafety接口。 如下面的类CDispComSn类。其中对GetInterfaceOptions函数也做了简单的重载,当然,不重载可以使用某些选项达到目的,具体见: http://msdn2.microsoft.com/en-us/library/z4z0at8a.aspx 下面copy了整个类的代码,以方便理解: class ATL_NO_VTABLE CDispComSn :

 public CComObjectRootEx<CComSingleThreadModel>,

 public CComCoClass<CDispComSn, &CLSID_DispComSn>,

 public IDispatchImpl<IDispComSn, &IID_IDispComSn, &LIBID_ComputerIdLib, 1, 0>,

 public IObjectSafetyImpl<CDispComSn,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>//这是需要手工添加屏蔽安全对话框

{

public:

 CDispComSn()

 {

 } DECLARE_REGISTRY_RESOURCEID(IDR_DISPCOMSN)

BEGIN_COM_MAP(CDispComSn)

 COM_INTERFACE_ENTRY(IDispComSn)

 COM_INTERFACE_ENTRY(IDispatch)

 COM_INTERFACE_ENTRY(IObjectSafety)

END_COM_MAP()    DECLARE_PROTECT_FINAL_CONSTRUCT()  HRESULT FinalConstruct()

 {

  return S_OK;

 }  void FinalRelease()

 {

 }

 STDMETHODIMP GetInterfaceSafetyOptions( REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions){

  ATLTRACE(_T("CDispComSn::GetInterfaceSafetyOptions()/n"));

  *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;

  *pdwEnabledOptions = *pdwSupportedOptions;

  return S_OK;

 }

 STDMETHODIMP GetInterfaceSafetyOptions( REFIID riid, DWORD *dwOptionSetMask, DWORD dwEnabledOptions){

  ATLTRACE(_T("CDispComSn::GetInterfaceSafetyOptions()/n"));

  return S_OK;

 } public: public:

 STDMETHOD(GetHardDiskSn)(BSTR* pComSn);

public:

 STDMETHOD(GetCpuSn)(BSTR* pValCpuSn);

public:

 STDMETHOD(GetNetcardSn)(BSTR* pValNetcardSn);

public:

 STDMETHOD(GetBiosSn)(BSTR* pValBiosSn);

}; OBJECT_ENTRY_AUTO(__uuidof(DispComSn), CDispComSn) 实现了IObjectSafety接口之后,即使IE的options中的高级里面的安全采用default setting,那么也不会再提醒你所谓的是否允许运行了。