最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

VS2012.C#开发ActiveX组件流程以及注意事项v1.0

来源:动视网 责编:小OO 时间:2025-10-01 21:01:19
文档

VS2012.C#开发ActiveX组件流程以及注意事项v1.0

C#开发ActiveX组件流程以及注意事项唯笑志在QQ群:54256083ITER职业交流群:141588103软件破解技术群:525922目录C#开发ActiveX组件流程以及注意事项1一.前言2二.开发环境2三.组件开发过程23.1新建“MyActiveX”项目23.2在ActiveXControl组件类上增加属性和方法33.3增加客户端信任代码53.4修改AssemblyInfo.cs文件83.5修改ActiveXControl项目属性9四.ActiveX控件的打包发布114.1添加
推荐度:
导读C#开发ActiveX组件流程以及注意事项唯笑志在QQ群:54256083ITER职业交流群:141588103软件破解技术群:525922目录C#开发ActiveX组件流程以及注意事项1一.前言2二.开发环境2三.组件开发过程23.1新建“MyActiveX”项目23.2在ActiveXControl组件类上增加属性和方法33.3增加客户端信任代码53.4修改AssemblyInfo.cs文件83.5修改ActiveXControl项目属性9四.ActiveX控件的打包发布114.1添加
C#开发ActiveX组件流程以及注意事项

唯笑志在

QQ群:54256083

ITER职业交流群:141588103

软件破解技术群:525922

目录

C#开发ActiveX组件流程以及注意事项    1

一.前言    2

二.开发环境    2

三.组件开发过程    2

3.1 新建“MyActiveX”项目    2

3.2 在ActiveXControl组件类上增加属性和方法    3

3.3 增加客户端信任代码    5

3.4修改AssemblyInfo.cs 文件    8

3.5 修改ActiveXControl项目属性    9

四.ActiveX控件的打包发布    11

4.1 添加“安装和部署”工程    12

4.2 添加项目主输出    13

4.3 设置Register 属性为vsdrpCOM    13

4.4 查看是否注册了ActiveX组件    14

五.测试和加载ActiveX过程    15

5.1 建立Web 应用程序项目    15

5.2 测试结果    16

5.3  IE设置    17

六.自动安装ActiveX    19

6.1 打包cab安装包    19

6.2 自动安装    21

七.引用程序设计说明    22

一.前言

ActiveX 控件以前也叫做OLE 控件或OCX 控件,它是一些软件组件或对象,可以将其

插入到WEB 网页或其它应用程序中。使用ActiveX 插件,可以轻松方便的在Web 页中插

入多媒体效果、交互式对象以及复杂程序等等。

通常使用MFC或VB 开发ActiveX 控件,本文章来讨论Microsoft Visual Studio 开发工具

实现开发ActiveX组件整个过程。在开发过程中有些注意事项和细节需要注意。

二.开发环境

开发工具:VS2012

操作系统:Windows 8.1

.NET版本:2.0及以上版本

开发语言:C#

三.组件开发过程

3.1新建“MyActiveX”项目

把项目里默认建立的类库删除掉。新建“用户控件”,并且命名为“ActiveXControl”。如下图:

图 3.1-1 项目组件

3.2在ActiveXControl组件类上增加属性和方法

[ComVisible(true)]//允许进行COM注册

    [Guid("C341DFF3-BA35-4AA4-8FD1-EB7715F75E86")] //标识在注册表中唯一的GUID码。

    [ClassInterface(ClassInterfaceType.AutoDual)]//标识为某个类生成的类接口的类型。

public partial class ActiveXControl : ObjectSafety

    {

publicActiveXControl()

        {

InitializeComponent();

        }

///

        /// 组件本身内部的事件,并把信息显示在组件的Label上。

///

///

///

private void button1_Click(object sender, EventArgs e)

        {

            this.label1.Text = "单击成功";

        }

///

        /// 这是一个公开的方法,供网页的JAVASCRIPT调用的,进行交互。

///

public void Test()

        {

            label1.Text = "测试成功";

        }

}

在ActiveXControl组件中入一个Button和Label控件,Button的单击事件对应着button1_Click事件函数,并且改变Label的Text属性,并且改变ActiveXControl的背景颜色。如下图:

图3.2-1 组件界面

注:可以在菜单“工具”中的“创建GUID”中创建唯一的GUID码,与类的[Guid("C341DFF3-BA35-4AA4-8FD1-EB7715F75E86")]标识有关。如下图:

图3.1-2 创建GUID码

注:必须在组件类上标识[Guid("C341DFF3-BA35-4AA4-8FD1-EB7715F75E86")]属性,因为有可能每次生成项目的时候,这个GUID都会改变,对于应用系统来讲,最好是固定的,这样就不需要重新部署了。

3.3 增加客户端信任代码

为了让ActiveX 控件获取客户端的信任,控件类还需要实现一个名为

“IObjectSafety”的接口,先创建该接口,并且定义该接口中方法,如下代码。(注:不能修改该接口的GUID 值)。

[ComImport, Guid("4A359FBB-C9A4-494E-B048-AC068DB4FCB2")]

    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

public interfaceIObjectSafety

    {

        [PreserveSig]

intGetInterfaceSafetyOptions(ref Guidriid, [MarshalAs(UnmanagedType.U4)] ref intpdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref intpdwEnabledOptions);

        [PreserveSig()]

intSetInterfaceSafetyOptions(ref Guidriid, [MarshalAs(UnmanagedType.U4)] intdwOptionSetMask, [MarshalAs(UnmanagedType.U4)] intdwEnabledOptions);

}

再新建一个“用户组件”,命名为“ObjectSafety”,并实现IObjectSafety接口,以及该接口下的函数,代码如下:

public class ObjectSafety : UserControl, IObjectSafety

    {

privateconst string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";

privateconst string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";

privateconst string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";

privateconst string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";

privateconst string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";

privateconstint INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;

privateconstint INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;

privateconstint S_OK = 0;

privateconstint E_FAIL = unchecked((int)0x80004005);

privateconstint E_NOINTERFACE = unchecked((int)0x80004002);

privatebool _fSafeForScripting = true;

privatebool _fSafeForInitializing = true;

publicintGetInterfaceSafetyOptions(ref Guidriid, ref intpdwSupportedOptions, ref intpdwEnabledOptions)

        {

intRslt = E_FAIL;

stringstrGUID = riid.ToString("B");

pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_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)

pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;

break;

default:

Rslt = E_NOINTERFACE;

break;

            }

returnRslt;

        }

publicintSetInterfaceSafetyOptions(ref Guidriid, intdwOptionSetMask, intdwEnabledOptions)

        {

intRslt = E_FAIL;

stringstrGUID = riid.ToString("B");

switch (strGUID)

            {

case _IID_IDispatch:

case _IID_IDispatchEx:

if (((dwEnabledOptions&dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) &&

                            (_fSafeForScripting == true))

Rslt = S_OK;

break;

case _IID_IPersistStorage:

case _IID_IPersistStream:

case _IID_IPersistPropertyBag:

if (((dwEnabledOptions&dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) &&

                            (_fSafeForInitializing == true))

Rslt = S_OK;

break;

default:

Rslt = E_NOINTERFACE;

break;

            }

returnRslt;

        }

}

“ActiveXControl”组件继承“ObjectSafety”组件,使之继承UserControl组件和IObjectSafety接口,代码:public partial class ActiveXControl : ObjectSafety

3.4修改AssemblyInfo.cs文件

如下图:

图3.4-1 程序集标识文件

引用命名空间:using System.Security;

添加:[assembly: AllowPartiallyTrustedCallers()]

代码如下:

图3.4-2 修改程序集标识文件

3.5 修改ActiveXControl项目属性

右键单击ActiveXControl项目,选择“属性”,如下图:

图3.5-1 项目属性页

选择“程序集信息”,如下图:

图3.5-2 程序集信息

选择“使程序集COM可见”选项,并单击“确定”按钮。

选择“ActiveXControl”项目属性的“生成”选项卡,并勾选“为COM 互操作注册(P)”,此处是在debug 状态下修改的,如果是调到release 状态下,还需要再设置一下,如下图:

图3.5-3生成页属性

到此为止,ActiveX组件就开发完成了,如果涉及到复杂的业务,例如:访问数据库、GDI+以及其他的操作,都可以完成了。可以生成此项目了。

四.ActiveX控件的打包发布

ActiveX 控件可以通过Visual Studio的“安装和部署”进行部署。

需要注意的有两点:

⏹将以上创建的用户控件项目作为主输出项目;

⏹设置其Register 属性为vsdrpCOM;

4.1 添加“安装和部署”工程

方法:右键“解决方案”—>添加—>新建项目,如下图:

图4.1-1 新建打包项目

图4.1-2 安装项目

4.2 添加项目主输出

如下图:

图4.2-1添加项目输出

图4.2-2添加主输出

4.3 设置Register 属性为vsdrpCOM

在解决方案中选中“主输出来自ActiveX(活动)”。如下图:

图4.3-1设置注册COM方式

现在就可以生成发布项目了,在客户端的电脑上都需要安装这个打包程序,用于注册ActiveX组件。如果,在本机(开发机)测试的话,在生成“ActiveXControl”项目的时候,默认可能已经进行注册,就不需要安装打包后的程序的。

4.4 查看是否注册了ActiveX组件

可以使用“OLEVIEW.EXE”工具查看ActiveX是否被注册了,如下图:

图4.4-1 查看ActiveX组件

五.测试和加载ActiveX过程

5.1 建立Web 应用程序项目

建立一个Web 应用程序项目,在测试页面的HTML 代码中添加对ActiveX 控

件的引用,并可以通过Javascript 调用控件的公共成员(注意这里的clsid 后面的值

就是前面为用户控件类设置的GUID),如下代码:

//引用组件,clsid就是组件类的GUID。

5.2 测试结果

如下图:

图 5.2-1测试成功

组件内部事件和客户端调用组件内部函数都成功。

5.3 IE设置

如果是发布成网站,需要对IE浏览器进行设置,根据不同版本的IE浏览器的安全权限不一样,一般说来,需要把网站的URL地址设置成“可信任的站点”,另外,把“自定义级别”设置为“低”。如下图:

图5.3-1 IE选项

图5.3-2 受信任的站点

图5.3-3 自定义级别

六.自动安装ActiveX

6.1打包cab安装包

6.1.1准备安装工具

下载工具,使用CAB SDK 中的工具CABARC.EXE (下载地址

http://support.microsoft.com/kb/310618),创建并编写INF 文件,把inf和msi打包成cab包。解压后的工具如图:

图6.1-1 打包CAB工具

6.1.2 编辑Inf文件,新建文件文件,把文件命名为“MyActiveX.INF”

编辑文件内容如下:

[version]

signature="$CHICAGO$"

AdvancedINF=2.0

[Setup Hooks]

hook1=hook1

[hook1]

run=msiexec.exe /i "%EXTRACT_DIR%\\MyActiveX.msi"

6.1.3 打包CAB

基本命令格式:CABARC.EXE -s 6144 n MyActiveX.cab MyActiveXSetup.msi MyActiveX.inf

解析:-s 6144:为签名留下6k 的空间n 创建cab

*.cab 是要创建的cab 包;

*.msi 是安装工程生成的安装程序;

*.inf 是本人自己编写的inf 文件;

执行打包命令,如下图:

图6.1-2打包CAB命令

打包后的文件,如下图:

图6.1-3 CAB包

6.2 自动安装

6.2.1 把CAB复制到WEB应用程序的根目录下,如下图:

图6.2-1复制到程序根目录下

6.2.2 把CAB包包含到程序的项目中,如下图:

图6.2-2包含到项目中

6.2.3 引用到程序代码中,增加到HTML 代码标签的codebase 属性中,代码如下:

注:如图不能进行自动安装,请参见“5.3 IE设置”和“七.引用程序设计说明”

七.引用程序设计说明

在设计程序的时候,不建议使用自动安装ActiveX的方式,也就是不要使用的codebase属性加载cab或是msi程序包。

经测试IE6、IE7、IE8是可以自动安装的。但是IE11无法执行自动安装,这涉及到多方面因素,例如:IE11安全性设置、操作系统(WINDOWS8.1)安全性设置、磁盘访问的安全性设置等。

综合考虑,在设计程序的时候,可以用js脚本判断activex是否被加载,如果没有加载,提示下载连接,以及安装等操作。

唯笑志在

                                                   2015-02-10

文档

VS2012.C#开发ActiveX组件流程以及注意事项v1.0

C#开发ActiveX组件流程以及注意事项唯笑志在QQ群:54256083ITER职业交流群:141588103软件破解技术群:525922目录C#开发ActiveX组件流程以及注意事项1一.前言2二.开发环境2三.组件开发过程23.1新建“MyActiveX”项目23.2在ActiveXControl组件类上增加属性和方法33.3增加客户端信任代码53.4修改AssemblyInfo.cs文件83.5修改ActiveXControl项目属性9四.ActiveX控件的打包发布114.1添加
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

Top