关于ActiveX控件的开发.docVIP

  • 6
  • 0
  • 约1.32万字
  • 约 10页
  • 2017-08-11 发布于重庆
  • 举报
关于ActiveX控件的开发

第一章 COM组件的安全性问题 当我们实现的COM对象,或者ActiveX控件在浏览器中调用的时候,往往会出现警告框,提示不安全的控件正在运行。这是因为浏览器安全策略所限定的,浏览器认为只有“安全的对象”才能够被执行。 所谓安全的对象就是指那些不访问本地资源的对象,例如不会去读注册表,不会写文件等等。一个满足条件的对象通过支持IObjectSafety接口告诉浏览器,自己是合法的。 下面就简单的介绍一下怎么在C#中实现对于IObjectSafety接口的支持。 ? 思路 C/C++d的程序可以直接在SDK中找到IObjectSafety的定义,所以需要支持的话非常容易。C#比较麻烦,因为我们没有办法获得IObjectSafety的定义,不过没有问题,我们可以按照IObjectSafety在SDK中的定义,在C#的工程中重新定义该接口。 如果大家了解COM机制一定会知道,所谓借口的定义之出现在类型库中,与实现无关。而判断一个接口唯一性就是定义接口时指定的UUID。此外自己重新定义时需要保证接口中没有函数的参数与返回值必须与原定义一致即可。 我们的做法就是,找到ObjSafe.idl,然后复制其中的UUID,利用这个UUID在C#中定一个interface IObjectSafety,并且申明其中的两个函数;定义完成之后,让需要检查安全接口的组件继承该接口,并在该组件内部实现IObjectSafety的两个函数,按照要求做适当的返回,那么用这个组件包装的COM对象在IE中调用就被认为是安全的了。 ? 第一次尝试 按照上面的思路,我们开始进行尝试 idl中的接口定义 [ ?object, ?uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064), ?pointer_default(unique) ] interface IObjectSafety : IUnknown { ?HRESULT GetInterfaceSafetyOptions( ??[in]? REFIID?riid,?????// Interface that we want options for ??[out] DWORD?*?pdwSupportedOptions,?// Options meaningful on this interface ??[out] DWORD *?pdwEnabledOptions);??// current option values on this interface ? ?HRESULT SetInterfaceSafetyOptions( ??[in]? REFIID?riid,?????// Interface to set options for ??[in]? DWORD??dwOptionSetMask,??// Options to change ??[in]? DWORD??dwEnabledOptions);??// New option values } IObjectSafety接口定义 ??? 因为接口中存在指针,所以直接采用Int32的整型形式,用到了unsafe code。 ?[Guid(CB5BDC81-93C1-11cf-8F20-00805F2CD064)] ?public interface IObjectSafety ?{ ??// methods ??unsafe void GetInterfacceSafyOptions( ???System.Int32 riid, ???System.Int32* pdwSupportedOptions, ???System.Int32* pdwEnabledOptions); ??void SetInterfaceSafetyOptions( ???System.Int32 riid, ???System.Int32 dwOptionsSetMask, ???System.Int32 dwEnabledOptions); ?} 继承 ?public class MyControl : System.Windows.Forms.UserControl,IObjectSafety 实现 ??// implement functions of IObjectSafety ??public unsafe void GetInterfacceSafyOptions(System.Int32 riid,System.Int32* pdwSupportedOptions,System.Int32* pdwEnabledOptions) ??{ ????????... ??} ??public void SetInterfaceSaf

文档评论(0)

1亿VIP精品文档

相关文档