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

开发环境是Vs 2012  Framework 4.0

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

一. 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里的序列号
看一下效果吧

 Active源码.rar

cab制作工具.rar

 

 

时间: 2024-09-25 04:01:51

visual studio 2012 的制作ActiveX、打包和发布的相关文章

《Windows 8 开发权威指南:HTML5 和JavaScript卷》——1.4 Visual Studio 2012新特性

1.4 Visual Studio 2012新特性 1.4.1 Windows Microsoft Design样式应用程序1.设计和构建Microsoft Design Style样式应用程序通过1.3节我们对Microsoft Design样式应用程序有了一个基本的了解. 使用默认项目模板构建Microsoft Design样式应用程序,这些模板为不同的Microsoft Design样式应用程序提供了文件.资源和结构. 使用 XAML 和 C+ +.C# 或 Visual Basic构建M

如何在Visual Studio 2012中禁用Shift+Delete快捷键的剪切操作

在 Visual Studio 2012 中编写代码时,一个经常用到的快捷键是 Shift+Delete(删除整行). 刚刚从之前的博文(Visual Studio 2012令人恼火的默认设置:Ctrl-C会复制空行清空剪贴板)的评论中得知这个快捷键会进行剪切操作: 心态要好: 不仅ctrl-c会占用剪贴板,ctrl-x也会,就连接常用的整行删除(shift delete)也会占用剪贴板 我都想不通了,按下shift delete就是整行删除咯,还把这行的内容放到剪贴板里是什么意思 那如何解决这

visual studio 2012空格上为何出现蓝色的点和箭头

visual studio 2012空格上出现蓝色的点和箭头: 突然发现打开visual studio 2012的时候出现了很多蓝色的点和箭头,解决办法是:按快捷键Ctrl+R+W 或 Ctrl+E+S,一切都搞定了. 事实上很多时候我们希望看看代码和代码之间究竟空了多少距离,似乎肉眼看并不明显,Visual Studio 2010 给我们提供了这样的功能.我们先看一段平常的代码,如下图所示: 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn

Visual Studio 2012 单元测试之泛型类(Generics Unit Test)

关于单元测试,如果不会用可以参照我的上篇博文----在Visual Studio 2012使用单元测试 首 先分享一篇博文,[Visual Studio] 开启Visual Studio 2012通过右键菜单创建单元测试(Unit Test). 泛型有两种,一般泛型与类型约束泛型,在对包含泛型的方法进行单元测试中也可以这么分,详情可 参阅http://msdn.microsoft.com/en-us/library/vstudio/ms243401.aspx  .从该页面可以知道,关于 泛型的单

Visual Studio 2012能让你更好的测试Windows 8应用

微软在推出Windows 8 RTM同时也开放了Windows Store,应用开发者可以开始 在商店里提交Windows 8付费应用.在他们考虑上传应用时,开发者们应该尝试测 试这些应用,看它们能否在几种不同类型的Windows 8硬件中运行良好.在官方的 Windows 8应用开发者博客的新博文中,微软详细解说了应用开发者可以如何使用 Visual Studios 2012测试他们的作品.其中包括确保该应用可以在不同屏幕尺寸 和分辨率中运行良好. 微软在文中表示: 测试的首要任务之一就是任何

visual studio 2012安装图解教程

Visual Studio 2012 拥有全新的开发界面和诸多新功能,Visual Studio 2012是我们到目前为止最卓越的版本. 它的目的就是帮助您在贵在创意.重在速度的市场中发展壮大. 让我们来看一看它帮助您将创意快速转化为应用程序的一些方法. Visual Studio 2012 RC 的安装: 首先,推荐安装环境.Windows 7 或者更高的版本! 插入Visual Studio 2012 光碟,或者用虚拟光驱加载 Visual Studio 2012 镜像! 打开光驱或者虚拟光

Visual Studio 2012.2中文版开下了

  微软的Visual Studio团队日前放出了Visual Studio 2012 Update 2的升级,本次升级主要增加了一系列新功能,并对之前存在的Bug进行了修复. Visual Studio 2012.2 本次新版本名为Visual Studio 2012.2,加入的新功能主要包括敏捷规划.质量支持.业务线应用程序开发和开发体验,此外Windows Store开发也过得了一些新功能. 与Windows和Windows Phone.Windows Azure等产品一样,Visual

图片-重新装的Visual Studio 2012 在打开以前的项目时 出现如下图

问题描述 重新装的Visual Studio 2012 在打开以前的项目时 出现如下图 应该怎么办 ????? 解决方案 你有没有安装第三方的插件.你的vs创建一个一般的项目报错么?如果只是打开这个项目报错,看下是不是这个项目依赖的某个库没有. 按照对话框提示的,把activitylog.xml找出来打开,看下报什么具体的错.

自带的网站-visual studio 2012 中有一个专门设置roles 和用户的站点在2015中怎么打开

问题描述 visual studio 2012 中有一个专门设置roles 和用户的站点在2015中怎么打开 visual studio 2012 中有一个专门设置roles 和用户的站点在2015中怎么打开? 解决方案 直接打开就可以了,VS2015向下兼容asp.net 4.0 解决方案二: 可以向下兼容的,直接在File中选择打开文件就好了