C#实现ActiveX插件

文章属于原创,转载请联系本人。有参照两个博客(http://blog.csdn.net/seanbei/article/details/53692899)

 

1、ActiveX插件的制作

环境:vs2010cert2spc.exemakecert.exesigntool.exesigncode.exe makecab.exe

 

1.1创建

创建选择C# -> Windows Forms Control Library,点击finish

 

 

1.2使程序集COM可见

右键项目——属性——应用程序——程序集信息,然后选中使程序集COM

 

 

点击生成,然后选中COM互操作注册,如下图所示:

 

 

1.3添加用户控件

ActiveX项目右键->添加->用户控件,取名demo

 

 

 为button1添加Click事件

 

private void button1_Click(object sender, EventArgs e)

{

     MessageBox.Show(this.textBox1.Text);

}

1.4、创建GUID

vs2010菜单栏->工具->创建GUID(选5

我的项目的GUID为[Guid("A886B6E3-9FE0-45F3-B11E-E94C68DDDA92")]

1.5添加IObjectSafety接口

右键项目——添加类——接口—输入IObjectSafety,直接点击Add

在接口中输入以下代码:

注意:这个Guid不用修改,直接复制

 [ComImport, Guid("1D9AD540-F2C9-4368-8697-C4AAFCCE9C55")]

    [InterfaceType(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);

 

    }

1.6、继承IObjectSafety接口

修改demo控件类继承IObjectSafety接口

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;//Guid引用

 

using Selenium;

using OpenQA.Selenium;

using OpenQA.Selenium.IE;

//using OpenQA.Selenium.IE.InternetExplorerDriver;

 

using OpenQA.Selenium.PhantomJS;

using System.Diagnostics;  

 

namespace ActiveXForm

{

    [Guid("A886B6E3-9FE0-45F3-B11E-E94C68DDDA92")]

    public partial class demo : UserControl, IObjectSafety

    {

        public demo()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {           

            IWebDriver selenium = new InternetExplorerDriver();

            selenium.Navigate().GoToUrl("https://hdrk-test.fs.em2.oraclecloud.com/homePage/faces/FuseWelcome");

            Process[] p = Process.GetProcessesByName("IEDriverServer"); //根据进程名获得指定的进程

            

            if (selenium.Title == "Sign In")

            {

                selenium.FindElement(By.Id("userid")).SendKeys("techadmin@hytera.com");

                selenium.FindElement(By.Id("password")).SendKeys("Hytera2017");

              selenium.FindElement(By.Id("btnActive")).Click();

           }

            Console.WriteLine(selenium.PageSource);

            

            p[0].Kill(); //杀死该进程

           

 

        }

 

        private string GetPhantomJSDriverService()

        {

            throw new NotImplementedException();

        }

 

       

 

        public string str()

        {

            return this.textBox1.Text;

        }

        #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

 

        private void demo_Load(object sender, EventArgs e)

        {

 

        }

 

        

    }

}

项目运行,至此,ActiveX插件就算完成

 

1.7、新建一个安装项目

 

Other Project Types -> Visual Studio Installer -> Setup Project

1.8、项目输出

在项目上点右键,【添加】->【项目输出】,选择上边的项目

双击箭头所指

选择主输出右键属性窗口,设置Register为vsdrpCOM

项目运行,Debug目录下有两个文件,exe文件和msi文件

1、打包成CAB文件

2.1、编写inf文件

[version]  

signature="$CHICAGO$"  

AdvancedINF=2.0  

 

[Setup Hooks]  

hook1=hook1  

 

[hook1]  

run=msiexec.exe /i "%EXTRACT_DIR%\Setup2.msi" /qn

msi修改成自己的即可

2.2、编写bat文件

新建txt文件,加入以下内容,将文件名重新命名build.bat即可。其中Activex.cab是生成目标cab的名称;install.inf是第一步生成的文件名,而Setup2.msi是需要打包的安装程序名;第二条ping命令仅仅是让批处理不要那么快退出,起到更利于观察生成结果的作用。

 

"cabarc.exe" -s 6144 n ActiveX.cab ActiveX.inf Setup2.msi

ping -n 20 127.0.0.1 >nul

 

确保infmsi文件,cabarc.exe在同一个文件下,点击bat文件,即可生成CAB文件

2.3、创建证书和私钥

 

 使用命令makecert.exe创建证书和私钥文件(先放入cert2spc.exemakecert.exesigntool.exe)

在当前文件夹下执行下面命令(n-证书颁发对象)

makecert -sv "ActiveXHello.pvk" -n "CN=lhsoft.net" -r ActiveXHello.cer

 

 

输入两次一样的密码;

1、CAB进行签名

signcode.exe进行签名

3.1、选择cab文件

3.2选择自定义

3.3选择cer证书

选择刚刚生成的cer证书

3.4选择秘钥

默认选择磁盘上的私钥文件

3.6填入数据描述

Windowshttp://www.microsoft.com

3.7时间戳服务器URL

填入免费的时间戳服务器URL http://timestamp.wosign.com/timestamp

4. 最后

自己创建htm文件,内容:

 

<html>

<head runat="server">

    <title>无标题页</title>

    <script type="text/javascript">

    function aa() {

    alert(document.getElementById('Object1').str());

    }

</script>

</head>

<body>

 

<h1>Portal</h1>

<object id="helloworld" classid='clsid:A886B6E3-9FE0-45F3-B11E-E94C68DDDA92' width="184" height="150" CODEBASE=ActiveX.cab##FileVersion=1,0,0,1></object>

 

</body>

</html>

打开htm页面,下载即可。

 

 想用C++实现可以跳转到 http://www.cnblogs.com/huangd/p/8021865.html

 

 

 

 

 

 

 

 

 

posted @ 2017-12-18 16:36  爱喝凉白开  阅读(5194)  评论(1编辑  收藏  举报