没有合适的资源?快使用搜索试试~ 我知道了~
使用C#开发ActiveX控件
需积分: 5 0 下载量 141 浏览量
2023-06-06
13:35:22
上传
评论
收藏 887KB PDF 举报
温馨提示
试读
24页
使用C#开发ActiveX控件
资源推荐
资源详情
资源评论
使用 C#开发 ActiveX 控件(新)
艺林博客:http://yilin.cnblogs.com/ 1
使用 C#开发 ActiveX 控件(新)
摘要:ActiveX 是广泛应用于 IE 浏览器的一种 COM 技术,而使用 C#语言开发 ActiveX
控件技术由于属于非主流,所以存在不少技术难点。本文将从 ActiveX 控件的开发、发布、
应用、部署和升级等方面,系统地介绍使用 C#开发 ActiveX 控件技术的方方面面,帮助你
一步一步顺利掌握该技术。
前言
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;浏览器端测试
使用 C#开发 ActiveX 控件(新)
艺林博客:http://yilin.cnblogs.com/ 2
环境为 Windows 7 旗舰版,IE8。
控件开发
使用 C#进行 ActiveX 控件开发过程其实很简单。首先,在解决方案中添加一个类库项
目,目标框架使用.NET Framework 2.0,如图 1 所示:
图 1 创建 ActiveX 控件类库
此处有一个关键操作,需要设置类库项目属性->程序集信息->使程序集 COM 可见,如
图 2 所示:
使用 C#开发 ActiveX 控件(新)
艺林博客:http://yilin.cnblogs.com/ 3
图 2 设置 ActiveX 控件类库程序集 COM 可见
ActiveX 类库的内容大致包括两部分,IObjectSafety 接口和实现该接口的控件类。
考虑所有控件类都要实现 IObjectSafety 接口,可以将该接口的实现抽象为一个控件基类。
一、IObjectSafety 接口
为了让 ActiveX 控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”
的接口。先创建该接口(注意,不能修改该接口的 GUID 值),接口内容如下:
[ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwS
upportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);
[PreserveSig()]
int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOption
SetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
}
二、ActiveXControl 控件基类
使用 C#开发 ActiveX 控件(新)
艺林博客:http://yilin.cnblogs.com/ 4
public abstract class ActiveXControl : IObjectSafety
{
#region IObjectSafety 成员
private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB
851}";
private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
private const int S_OK = 0;
private const int E_FAIL = unchecked((int)0x80004005);
private const int E_NOINTERFACE = unchecked((int)0x80004002);
private bool _fSafeForScripting = true;
private bool _fSafeForInitializing = true;
public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pd
wEnabledOptions)
{
int Rslt = E_FAIL;
string strGUID = riid.ToString("B");
pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFA
CESAFE_FOR_UNTRUSTED_DATA;
switch (strGUID)
{
case _IID_IDispatch:
case _IID_IDispatchEx:
Rslt = S_OK;
pdwEnabledOptions = 0;
if (_fSafeForScripting == true)
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
break;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
Rslt = S_OK;
pdwEnabledOptions = 0;
if (_fSafeForInitializing == true)
使用 C#开发 ActiveX 控件(新)
艺林博客:http://yilin.cnblogs.com/ 5
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
break;
default:
Rslt = E_NOINTERFACE;
break;
}
return Rslt;
}
public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOpt
ions)
{
int Rslt = E_FAIL;
string strGUID = riid.ToString("B");
switch (strGUID)
{
case _IID_IDispatch:
case _IID_IDispatchEx:
if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UN
TRUSTED_CALLER) &&
(_fSafeForScripting == true))
Rslt = S_OK;
break;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UN
TRUSTED_DATA) &&
(_fSafeForInitializing == true))
Rslt = S_OK;
break;
default:
Rslt = E_NOINTERFACE;
break;
}
return Rslt;
}
#endregion
}
三、MacActiveX 控件类
剩余23页未读,继续阅读
资源评论
teachtea2
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功