一个很原始的需求是:做了一个activex对象,只希望它在某些站点中使用。不希望在其它站点中使用。
或者说,不希望被别的人偷用。或者不希望被广泛使用而造成安全问题。
比如:在www.foo.com中可以使用,在www.bar.com中不能使用。
由于只有ie能创建并访问activeX,因此本文只适用于IE。
要解决这个问题,关键是两点:
- 如何在activex对象中判定当前域名或当前所在网页url。
- 如何在判定不能使用后,禁止用户使用。
对于2,应该是简单的,不能使用后,所有的接口都返回E_FAIL即可。当然,这里有更好的策略,还可以通知到用户。
对于1,我以前一直没有找到办法,虽然办法很简单。无非是实现一下IObjectWithSite,这样IE在创建activex的时候会把site传给创建的activex,这样就容易取得当前url了:
HRESULT CMyActiveX::SetSite(IN IUnknown *pUnkSite) { CComQIPtr<IServiceProvider> spsp = pUnkSite; pUnkSite->QueryInterface(&m_WebBrowser2); m_WebBrowser2->get_LocationURL(&m_bsUrl); //more.. } |
对于2,通知到用户的办法是,实现IObjectSafety,然后,在GetInterfaceSafetyOptions和SetInterfaceSafetyOptions中,根据当前情况返回E_FAIL就行了。
以上内容是是研究微软的某软件的一个activex控件在不同网页里的表现不同而发现的。