C#制作、打包、签名、发布Activex全过程
一、前言
最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信、调用,单单依靠HTML是无法实现了,因此必须借用Activex来实现。由于本人主要擅长C#,自然本文给出了用C#实现的范例,本文的预期效果是有一定Winform基础的人可都轻松读懂本文。


- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Runtime.InteropServices;
- namespace EasyActivex
- {
- [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
- [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IObjectSafety
- {
- [PreserveSig]
- int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);
- [PreserveSig()]
- int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
- }
- }


- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Text;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- namespace EasyActivex
- {
- //这个Guid,网页调用的时候用到,Mark
- [Guid("685F0A47-944D-4145-BF4E-76A02A422B02")]
- //这里要实现IObjectSafety接口
- public partial class EUserControl : UserControl, IObjectSafety
- {
- public EUserControl()
- {
- InitializeComponent();
- }
- #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-00AA004BB851}";
- private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
- private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
- private const int S_OK = ;
- 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 pdwEnabledOptions)
- {
- int Rslt = E_FAIL;
- string strGUID = riid.ToString("B");
- pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
- switch (strGUID)
- {
- case _IID_IDispatch:
- case _IID_IDispatchEx:
- Rslt = S_OK;
- pdwEnabledOptions = ;
- if (_fSafeForScripting == true)
- pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
- break;
- case _IID_IPersistStorage:
- case _IID_IPersistStream:
- case _IID_IPersistPropertyBag:
- Rslt = S_OK;
- pdwEnabledOptions = ;
- if (_fSafeForInitializing == true)
- pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
- break;
- default:
- Rslt = E_NOINTERFACE;
- break;
- }
- return Rslt;
- }
- public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
- {
- int Rslt = E_FAIL;
- string strGUID = 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;
- }
- return Rslt;
- }
- #endregion
- /// <summary>
- /// 打开记事本
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void btnOpenNote_Click(object sender, EventArgs e)
- {
- System.Diagnostics.Process.Start("notepad.exe");
- }
- }
- }
小提示:EUserControl代码的Guid可以用VS附带的Guid生成工具生成:

- //用户添加
- [assembly: AllowPartiallyTrustedCallers()]




- [version]
- signature="$CHICAGO$"
- AdvancedINF=2.0
- [Setup Hooks]
- hook1=hook1
- [hook1]
- run=msiexec.exe /i "%EXTRACT_DIR%\EasySetup.msi" /qn
2) build.bat制作。新建txt文件,加入以下内容,将文件名重新命名build.bat即可。其中EasyActivex.cab是生成目标cab的名称;install.inf是第一步生成的文件名,而EasySetup.msi是需要打包的安装程序名;第二条ping命令仅仅是让批处理不要那么快退出,起到更利于观察生成结果的作用。
- "cabarc.exe" -s n EasyActivex.cab install.inf EasySetup.msi
- ping -n 127.0.0.1 >nul




- <object id="csharpActiveX" codebase="Activex/EasyActivex.cab" classid="clsid:685F0A47-944D-4145-BF4E-76A02A422B02"></object>
运行效果如下:
点击即可在网页中打开记事本了。
六、参考资料:
1、使用C#开发ActiveX控件 http://www.cnblogs.com/yilin/archive/2009/09/15/1567332.html
2、Activex签名方法和工具技巧 http://www.360doc.com/content/10/0901/15/203871_50402416.shtml
3、中国数字认证网用户手册 http://www.ca365.com/forward.do?pageurl=/ca/yhsc.jsp
C#制作、打包、签名、发布Activex全过程的更多相关文章
- 发布Activex全过程
C#制作.打包.签名.发布Activex全过程 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠HTML是无法实现了,因此必须借用Activex来实现.由于 ...
- EclipseAndroid打包签名发布安装失败闪退运行不了
EclipseAndroid打包签名发布安装失败闪退运行不了 本来没怎么用过用Eclipse写安卓,可是有人有需要必须用Eclipse写,那就写呗. 可在签名打包的时候,发到手机上安装,提示安装成功. ...
- C# winFrom 制作、打包、签名、发布Activex全过程
注:转自园中 http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调 ...
- C#制作、打包、签名、发布Activex全过程【转】
http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠H ...
- ionic3应用的Android打包签名发布步骤
版权声明:本文为博主原创文章,未经博主允许不得转载. 当我们的ionic应用开发结束之后,就要开始上线到应用市场,那么Android的发布步骤具体是怎么样的呢? 1)编译 运行命令行: ionic c ...
- Android Studio 打包签名发布New Key Store
Key store path:存放路径 Key Alias:别名 Validity(years):有效期 Certificate:证书 First and Last Name: Organizatio ...
- Activex打包于发布完整版---微软证书制作
众所周知,Activex组件没有进行有效的签名,在IE上无法安装的,除非你让用户手工开启“接收任何未签名的ActiveX”,这个很明显不现实.而组件签名需要证书,证书从哪里来,你可以选择付1000到3 ...
- DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版发布
关于 DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版------------- ...
- Android打包签名
Ⅰ.用jdk和sdk自带工具打包签名 a.把jdk下的keytool.exe和jarsigner.exe所在目录(两个工具在同一目录) 添加到环境变量path 1)新建环境变量package,pack ...
随机推荐
- 制作类似ThinkPHP框架中的PATHINFO模式功能
一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...
- ABP文档 - Javascript Api
文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...
- PHP验证用户登录例子-学习笔记
1.基本流程: 2.UML类图: 3.PHP代码: 3.1 index.php <?php /** * Created by PhpStorm. * User: andy * Date: 16- ...
- 运用php做投票题,例题
要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...
- 问题记录:EntityFramework 一对一关系映射
EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...
- 当web.config文件放置在共享目录下(UNC),启动IIS会提示有错误信息500.19,伴随有错误代码0x80070003和错误代码0x80070005的解决办法
最近遇到一个很有意思的使用环境,操作人员将所有的网站应用内容投放到共享存储里面,并且使用微软的SMB协议将其以CIFS的方式共享出来,使用Windows Server 2008 R2的IIS将其连接起 ...
- 微信小程序初探
做为码农相信大家最近肯定都会听到微信小程序,虽然现阶段还没有正式开放注册,但大家可以还是可以开发测试. 到微信的WIKI(http://mp.weixin.qq.com/wiki?t=resource ...
- 【JS基础】正则表达式
正则表达式的() [] {}有不同的意思. () 是为了提取匹配的字符串.表达式中有几个()就有几个相应的匹配字符串. (\s*)表示连续空格的字符串. []是定义匹配的字符范围.比如 [a-zA-Z ...
- Linux基础介绍【第二篇】
远程连接Linux的原理 SHH远程连接介绍 当前,在几乎所有的互联网企业环境中,最常用的Linux提供远程连接服务的工具就是SSH软件,SSH分为SSH客户端和SSH服务端两部分.其中,SSH服务端 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...