天天看點

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,那麼也不會再提醒你所謂的是否允許運作了。