在 实现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,那么也不会再提醒你所谓的是否允许运行了。