c#编写activeX控件详细教程

经验分享
0 866
xukai
凯特云(xukai) 5 2021/4/21 14:27:50
编辑此贴 收藏

描述:vs2012


下载附件
asp.net编写activeX完整源代码

1、新建windows窗体控件库,命名为 MyActiveXDemo,打开Properties/AssemblyInfo.cs,修改为如下:

QQ图片20210421152142.jpg

2、打开工具箱,在自动生成的UserControl1.cs设计视图中添加一个button,如下图:

1.jpg

3、双击button1,为按钮添加方法,这里演示只添加了一个弹出消息,如下

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

4、创建接口IObjectSafety.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace MyActiveXDemo
{
    [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);

    }
}

5、修改UserControl1.cs,使其继承接口IObjectSafety,完整的UserControl1.cs如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MyActiveXDemo
{
    [Guid("73D3BE6A-E3B3-46F7-AFFE-8673390DA3F6"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]
    public partial class UserControl1 : UserControl, IObjectSafety
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("ActiveX Message.");
        }
        #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
    }
}

6、右键项目MyActiveXDemo属性,

      a、应用程序=》点击程序集信息=》勾选“使程序集COM可见”

3.jpg

      b、生成=》勾选“为COM互操作注册”

4.jpg

7、解决方案右键=》添加=》其它项目类型=》安装和部署,选中“InstallShield Limited Edition Project”,命名为“ActiveXSetup”,确定

5.jpg

8、点击application files=》My Product Name=》右下角点击add Product Outputs,在弹出框内勾选“主输出”,确定,如下图

6.jpg

9、右键ActiveXSetup,生成,成功后在ActiveXSetup\Express\DVD-5\DiskImages\DISK1下可以看到ActiveXSetup.msi安装程序,到这里就成功了一大半了。

10、网上下载一个cabarc.exe,放在与ActiveXSetup.msi安装文件相同目录,下载地址:https://sqdownd.rbread05.cn/down/42010_20161130174135.rar,在相同目录创建一个install.inf文件,文件内容如下:

[version]

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

11、同时在同目录创建一个build.bat,内容如下:

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

双击build.bat,执行完毕后将会生成一个test.cab文件,到此ActiceX控件已经打包好了。


如何在浏览器上加载ActiveX控件?请看下一篇:asp.net 如何在网页上加载ActiveX控件


个人签名:己所不欲勿施于人

回帖
  • 消灭零回复
本周热议
html+css+jquery 实现超帅留言墙效果!超帅,不喜勿喷!附完整demo 71
c# winform 身份证信息读取 14
和客服之间的神沟通 4
c#如何集成控制Led屏,实现数据发送自动开机、关机等操作! 3
关于站点启用HTTPS访问的通知 1
非法访问资源ip地址公布 1
不用写一句sql的ORM框架,支持多种数据库 1
c#如何获取电脑mac地址,超简单! 0
批量检测指定ip某些端口是否开启,用来做什么自己想吧!!! 0
c# 实现文件下载功能,带下载进度条,可用到软件的自动更新中 0
热门资讯
【每日一习话】把事业放在心上 把责任扛在肩上 663 
联播+ | 谋定而动 习近平引领京津冀携手下好“一盘棋” 540 
强力堆料,几乎没有短板、铭瑄iCraft B550M电竞之心主板评测 488 
第一观察 | 从两会“如期”召开看百年大党的执政能力 485 
看图猜成语:明明很简单,是不是大意了 483 
玖月奇迹王小玮近照曝光!穿紧身裤秀出小鸟腿,皮肤白到发光 478 
美媒承认搞错了,但已经来不及了 470 
《奇葩说》第七季总决赛,肖骁用不是自己风格的夺冠后,获得表扬 464 
广东一男子离职索赔270万,公司:你月薪才25万 459 
成人体验馆被封,客人一天点3个娃娃:男人的孤独,谁能懂? 451 
王霜首次回应结束留洋原因:不因贾秀全 只因这3个字 450 
被开除,程序员将公司告上法庭,公司怒怼:代码你写的,你担责 446 
美日共同发表"对中国措辞最强硬"声明 外交部撂重话 440 
扒女明星每日穿搭,千元Coach这样搭,千元CHANEL这样买! 438 
“波塞冬”无法拦截?俄军事专家:只能在发射前攻击它的母艇 418