开发环境是Vs 2012  Framework 4.0

源地址:http://www.cnblogs.com/li-peng/p/3455247.html

源码和制作工具在文章最下边

一. ActiveX控件Demo

新建一个Window窗体控件库项目

在自动生成的UserControl1页面上添加一个button

点击事件里我们只弹出一个MesageBox

        private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Click!!!!");
}

IE怎么知道一个插件是脚本安全的?它是通过以下两个办法。一是查询ActiveX组件是否实现了IObjectSafety接口,并且

返回脚本安全;二是查询ActiveX组件是否在注册表的Component  Category Manager里表明自己实现了

CATID_SafeForInitializing和CATID_SafeForScripting。

这里我们只说第一种实现IObjectSafety接口

接口格式是固定的不要修改

using System;
using System.Runtime.InteropServices;
namespace ActiveXDemo
{ [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);
}
}

在UserControl1控件的后台代码我们要实现这个接口

看一下代码

using System;
using System.Windows.Forms; namespace ActiveXDemo
{
using System.Runtime.InteropServices; [Guid("6169E98E-DA08-4E87-81B6-EE3A5034C0E2"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]
public partial class UserControl1: UserControl,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-00AA004BB851}"; 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 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 = 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;
} 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 public UserControl1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Click!!!!");
}
}
}

这里要做一下修改

[Guid("6169E98E-DA08-4E87-81B6-EE3A5034C0E2"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]

这个guid是我自己生成的还有ProgId里的ActiveXDemo.UserControl1是我自己工程里的,修改成你自己的
gui生成是在 菜单 工具 下边

            

打开项目属性,

在应用程序里 点击程序集信息 勾选 使程序集COM可见

在生成里边,勾选  为Com互操作注册

做到这里我们的ActiveX控件就做完了接下来我们把它发布

先是把它打包

Vs2012 打包我之前有些不同

新项目——其他项目 安装和部署

选择application information:基本配置,自定义填写

接下来先把Application Files,点击MyCompany下的第一个节点可以自己重命名

点击 Add Project OutPuts

选择主输出点ok

因为我们的demo就一个dll所以不用再有别的操作

如果想修改一下安装的窗体可以在Installation Interview里设置

在Express\DVD-5\DiskImages\DISK1文件夹下就是我们的安装软件了

一个exe一个mis我们只用mis的

还要一个cabarc.exe这个我会在下载里给大家提供

 cabarc.exe:微软提供的cab打包工具

     ActiveXSetup.msi:  项目生成的部署安装文件
 
    install.inf : 需要跟ActiveXSetup.msi打包在一起的文件
 
    build.bat:  打包的批处理命令

install.inf

[version]
signature="$CHICAGO$"
AdvancedINF=2.0 [Setup Hooks]
hook1=hook1 [hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\ActiveXSetup.msi" /qn

build.bat

"cabarc.exe"  n test.cab ActiveXSetup.msi install.inf 

运行一下bat就可以生成一个
cab

我们随便建一个webfrom网站

在debug下边建一下dll文件夹

把test.cab放到文件夹里

在首页上这样写

<body>
<form id="form1" runat="server">
<div>
<object id="mytt" classid="clsid:6169E98E-DA08-4E87-81B6-EE3A5034C0E2"
codebase="/DLL/test.cab"></object>
</div>
</form>
</body>
</html>

这个Classid就是我们在UserControl1.cs的Guid里的序列号
看一下效果吧

visual studio 2012 的制作ActiveX、打包和发布[转]的更多相关文章

  1. visual studio 2012 的制作ActiveX、打包和发布

    开发环境是Vs 2012  Framework 4.0 源码和制作工具在文章最下边 一. ActiveX控件Demo 新建一个Window窗体控件库项目 在自动生成的UserControl1页面上添加 ...

  2. 如何在Visual Studio 2012中发布Web应用程序时自动混淆Javascript

    同Java..NET实现的应用程序类似,Javascript编写的应用程序也面临一个同样的问题:源代码的保护.尽管对大多数Javascript应用公开源代码不算是很严重的问题,但是对于某些开发者来说, ...

  3. 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)

    前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...

  4. 在Visual Studio 2012中使用VMSDK开发领域特定语言1

    在Visual Studio 2012中使用VMSDK开发领域特定语言(一)   前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modelin ...

  5. Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)

    Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer   Advanced Installer :Free for 30 da ...

  6. Visual Studio 2012 Update 1 离线升级包(相当于VS2012 SP1离线补丁包)

    Visual Studio 2012 Update 1 发布也有一段时间了,吾乐吧尝试了好几次在线升级,但是网络不给力啊,结果都失败了.于是一直都想找到官方提供的VS2012 SP1完整离线升级包,不 ...

  7. 使用InstallUtil安装及卸载Windows服务的具体操作 Visual Studio 2012版本

    关于Visual Studio 2012中使用InstallUtil对Windows服务进行安装与卸载的文章,在MSDN中的http://msdn.microsoft.com/en-us/librar ...

  8. Office Developer Tools for Visual Studio 2012现在可用了

    [原文发表地址]   Now Available: Office Developer Tools for Visual Studio 2012 正如我以前写过的,我们正在为构建下一代Office和 S ...

  9. 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)

    本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...

随机推荐

  1. javascript 时间倒计时

    新加入一个项目的集中开发,遇到一个需要倒计时的需求,经过测试,有以下几种方案,分享出来: 方案一: 页面Html: <span style="font-size:18px;" ...

  2. 第一个vs2013控制台程序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 587A

    #include<iostream> #include<algorithm> #include<stdio.h> #include<stdlib.h> ...

  4. ps命令使用 进程查看

    ps命令是Process Status的缩写 用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命 ...

  5. SpringMVC解析1-使用示例

    Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它们更容易进行定制.Spring的MVC是基于servlet功能实现的,通过实现Servlet接口的Dispatch ...

  6. <meta>元素

    HTML <meta> 元素 meta标签描述了一些基本的元数据. <meta> 标签提供了元数据.元数据也不显示在页面上,但会被浏览器解析. META元素通常用于指定网页的描 ...

  7. Android自动化测试 - 自动化测试工具比较

  8. POJ3680 Intervals(最小费用最大流)

    选择若干条线段使权值最大,并且点覆盖次数不超过k. 建图如下:vs到0建立容量为k费用为0的边:坐标终点到vt连接一条容量为k费用为0的边:对于每两个相邻坐标连接一条容量为INF费用为0的边:对于线段 ...

  9. PLSQL Developer 不能连接 oracle 11g 64位 的解决办法

    http://blog.itpub.net/14184018/viewspace-760730 http://www.cnblogs.com/gulvzhe/archive/2012/08/27/26 ...

  10. 前端构建之gulp与常用插件

    gulp是什么? http://gulpjs.com/ 相信你会明白的! 与著名的构建工具grunt相比,有什么优势呢? 易于使用,代码优于配置 高效,不会产生过多的中间文件,减少I/O压力 易于学习 ...