本文主要是介绍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
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, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IObjectSafetyImpl<CDispComSn,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>//这是需要手工添加屏蔽安全对话框
{
public:
CDispComSn()
{
}
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDispComSn, &CLSID_DispComSn>,
public IDispatchImpl<IDispComSn, &IID_IDispComSn, &LIBID_ComputerIdLib, /*wMajor =*/ 1, /*wMinor =*/ 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;
}
{
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;
}
{
}
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);
};
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,那么也不会再提醒你所谓的是否允许运行了。
这篇关于ATL 实现IObjectSafety接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!