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打包工具
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 中的 Django Web 框架入门
- Unity Visual Effect Graph 制作Fireworks烟花特效
- 如果没有Visual Studio 2015,我们如何创建.NET Core项目 ?
- 埋点(Event Tracking)vs 无埋点(Codeless Tracking) vs 可视化埋点(Visual Event Tracking)
- Visual Studio 我的插件
- 在Visual Studio项目中根据系统平台自动引用32或64位的DLL
- 用Visual Studio2010 编译 C++文件"hello world”
- 12月6日科技资讯|百款 App 因违法采集个人信息遭下架整改;Visual Studio 2019 整合 GitHub
- Microsoft Teams Toolkit for Visual Studio Code
- 用于Azure功能的Visual Studio 2017工具
- Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记
- vscode: Visual Studio Code 常用快捷键
- Visual Studio Community 2013,功能完整,免费使用
- OpenGL基础之在Visual Stdio 2013中尝试使用OpenGL
- 配置Visual Studio 2008来调试.NET Framework源码的基本步骤
- Visual Studio添加自定义代码片段
- Dynamics CRM2013 在Visual Studio中开启脚本的Xrm.Page智能提示
- caffe搭建----Visual Studio 2015+CUDA8.0+CUDNN5配置Caffe-windows(BLVC)
- VS(Visual Studio)中Nuget的使用
- MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装 .NET Framework 2.0 SDK;2) 安装 M
- Visual Studio 2008提高工作效率的小技巧
- Windows下visual studio code搭建golang开发环境
- 【OpenGL】六、Visual Studio 2019 配置 GitHub ( 提取和拉取简介 | 拉取远程代码 )
- 带你玩转Visual Studio——带你理解多字节编码与Unicode码
- Visual Studio 必备神器---转
- Visual C++ 设置适合自己的解决方案目录结构
- 2018-2-13-Visual-studio-C#-代码使用-NotNull
- Centos 7 安装 Visual stdio Code