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