ie activex控件开发_火狐activex控件_ie activex控件

电脑杂谈  发布时间:2017-05-09 18:02:12  来源:网络整理

ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常ActiveX控件都是用C++或VB语言开发,本文介绍另一种方式,在.NET Framework平台上,使用C#语言开发ActiveX控件。

虽然本文通篇都在讲如何使用C#语言开发ActiveX控件,但我并不极力推荐使用这种技术,因为该技术存在明显的局限,即需要浏览器端安装.NET Framework(版本取决于开发ActiveX控件使用的.NET Framework版本),该局限对于挑剔的互联网用户,几乎是不可接受的。所以,我建议以下几条均满足时,方可考虑使用该技术:

开发团队中没有人掌握使用C++/VB开发ActiveX控件技术;

该ActiveX控件不用于互联网;

用户对仅能使用IE浏览器访问表示可以接受;

用户对在浏览器端安装.NET Framework组件表示可以接受。

另外,我建议如果不是因为控件的依赖库基于更高版本的.NET Framework,或需要更高版本的.NET Framework提供的扩展功能(如需要WCF等),尽量在.NET Framework 2.0上开发ActiveX控件,因为.NET Framework 2.0只有20M,相比300M的.NET Framework 3.5和40M的.NET Framework 4.0都要小很多,对客户端操作系统的要求也要低很多,并且随着Windows版本的不断升级换代,Windows Vista以后的版本已经内置了.NET Framework 2.0。等到Windows XP系统寿终正寝之时,也将迎来该技术的春天。所以,别被我上面的建议夯退了,掌握该技术其实还是蛮有实用价值的,毕竟,C#高效的开发效率很有吸引力。

本文接下来将使用C#语言开发一个ActiveX控件,实现对浏览器端的MAC地址遍历功能;另外,提供一个在Web静态页面中调用该控件的测试实例。本实例的开发环境为Visual Studio 2010旗舰版(SP1),目标框架为.NET Framework 2.0;浏览器端测试环境为Windows 7旗舰版,IE8。

使用C#进行ActiveX控件开发过程其实很简单。首先,在解决方案中添加一个类库项目,目标框架使用.NET Framework 2.0,如图1所示:

图1创建ActiveX控件类库

此处有一个关键操作,需要设置类库项目属性->程序集信息->使程序集COM可见,如图2所示:

图2设置ActiveX控件类库程序集COM可见

ActiveX类库的内容大致包括两部分,IObjectSafety接口和实现该接口的控件类。考虑所有控件类都要实现IObjectSafety接口,可以将该接口的实现抽象为一个控件基类。

一、IObjectSafety接口

为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口。先创建该接口(注意,不能修改该接口的GUID值),接口内容如下:

二、ActiveXControl控件基类

 1 public abstract class ActiveXControl : IObjectSafety
 2 {
 3     #region IObjectSafety 成员
 4 
 5     private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
 6     private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
 7     private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
 8     private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
 9     private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";
10 
11     private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
12     private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
13     private const int S_OK = 0;
14     private const int E_FAIL = unchecked((int)0x80004005);
15     private const int E_NOINTERFACE = unchecked((int)0x80004002);
16 
17     private bool _fSafeForScripting = true;
18     private bool _fSafeForInitializing = true;
19 
20 
21     public int GetInteceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
22     {
23         int Rslt = E_FAIL;
24 
25         string strGUID = riid.ToString("B");
26         pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
27         switch (strGUID)
28         {
29             case _IID_IDispatch:
30             case _IID_IDispatchEx:
31                 Rslt = S_OK;
32                 pdwEnabledOptions = 0;
33                 if (_fSafeForScripting == true)
34                     pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
35                 break;
36             case _IID_IPersistStorage:
37             case _IID_IPersistStream:
38             case _IID_IPersistPropertyBag:
39                 Rslt = S_OK;
40                 pdwEnabledOptions = 0;
41                 if (_fSafeForInitializing == true)
42                     pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
43                 break;
44             default:
45                 Rslt = E_NOINTERFACE;
46                 break;
47         }
48 
49         return Rslt;
50     }
51 
52     public int SetInteceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
53     {
54         int Rslt = E_FAIL;
55 
56         string strGUID = riid.ToString("B");
57         switch (strGUID)
58         {
59             case _IID_IDispatch:
60             case _IID_IDispatchEx:
61                 if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) &&
62                         (_fSafeForScripting == true))
63                     Rslt = S_OK;
64                 break;
65             case _IID_IPersistStorage:
66             case _IID_IPersistStream:
67             case _IID_IPersistPropertyBag:
68                 if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) &&
69                         (_fSafeForInitializing == true))
70                     Rslt = S_OK;
71                 break;
72             default:
73                 Rslt = E_NOINTERFACE;
74                 break;
75         }
76 
77         return Rslt;
78     }
79 
80     #endregion
81 }


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-46151-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...