澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

中开发ActiveX的学习笔记,发布总结

2019-11-24 作者:www.8455.com   |   浏览(89)
  1. 首先新建项目--->类库,取名:ActiveXDemo
  2. 图片 1
  3. 右键项目属性:应用属性==>程序集信息=>使程序集Com可见,
  4. 图片 2
  5. 生成==>输出==>为com互操作注册
  6. 新建接口类取名:IObjectSafety,以下代码可直接用,最好不要修改

    1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.InteropServices; 5 using System.Text; 6 7 namespace ActiveXDemo 8 { 9 [ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")] 10 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 11 public interface IObjectSafety 12 { 13 [PreserveSig] 14 int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); 15 [PreserveSig()] 16 int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions); 17 } 18 }

最近项目中需要做一个bs上传整个文件夹的功能,然而只有选择文件的控件,所以需要自己动手写一个activex控件,参考了很多资料,最后终于有了点结果,与大家分享。

原文地址:

文章属于原创,转载请联系本人。有参照两个博客(

1.为什么要用ActiveX?

新建用户控件取名:UserControl1,UserControl1继承自上面新建的接口IObjectSafety,并实现接口(实现接口的方法请复制下面的内容),在类UserControl1添加Guid特性值,利用VS的工具生成guid

[制作axtivex]

一个项目要用到ActiveX控件,参照网上众多的例子,ActiveX控件倒是很容易就搞出来了;
然后做了一个【安装项目】,倒是可以使用,只不过需要在客户端手动点击安装,下一步,下一步…觉得不是很爽;
又试了试【CAB项目】,好像没人用VS2008来做,费了点功夫,终于找到解决办法。
特将此经验与大家分享。

 

网页本身的功能是有限的,要想实现一些网页本身不支持的功能,比如:网页上的p2p视频播放,就得靠ActiveX这种古老的技术。

图片 3

第一步:建立vs2005工程,“新建项目”-“类库”。

开发工具:Visual Studio 2008
.NET版本:2.0
开发语言:C#

1、ActiveX插件的制作

环境:vs2010,cert2spc.exe,makecert.exe,signtool.exe,signcode.exe makecab.exe

 

2.c#能开发ActiveX吗?

 

第二步:添加新“组件”。

一、编写ActiveX控件
1、新建一个【Windows窗体控件库项目】

1.1、创建

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

 图片 4

 

严格意义上讲,c#是不能生成纯正ocx控件的,我们在vs.net中新建项目时,也找不到专门的"ActiveX项目"新建项,最多也只就能新建"类库"得到一个dll而非ocx(因此我们也无法用传统的regsvr32来注册该dll),但是c#能开发com组件,activeX控件本质上讲跟com是一类技术,所以用c#开发"能够让网页调用的com类库"还是可行的。

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 ActiveXDemo
{
    [Guid("C5BD015D-E2AA-4DD3-AEB7-93D7409FA751")]
    public partial class UserControl1 : UserControl, IObjectSafety
    {
        public UserControl1()
        {
            InitializeComponent();
        }

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

        public string GetGUID()
        {
            return Guid.NewGuid().ToString();
        }


        #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, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] 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, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] 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
    }
}

第三步:修改assemblyInfo文件,

图片 5

1.2、使程序集COM可见

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

图片 6

 

 

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

 图片 7

 

3.开发步骤:

进行简单界面布局:

using System.Security;

2、添加一个【用户控件】

1.3、添加用户控件

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

 图片 8

 

 为button1添加Click事件

 

private void button1_Click(object sender, EventArgs e)

{

     MessageBox.Show(this.textBox1.Text);

}

(1)新建一个类库 (2)修改项目的"属性",在“生成”选项中把“输出”中的“为com互操作注册”勾中,然后再到“应用程序”选项中找到“程序集信息”按钮,点击它,在弹出的界面中勾中“使程序集COM可见(M)”

图片 9

// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(true)]

图片 10

1.4、创建GUID

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

图片 11

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

图片 12

点击按钮效果见上面代码,还可自己写一个公共方法,我写的是GetGUID(),

[assembly: AllowPartiallyTrustedCallers()]

3、拖两个Label控件到界面上

1.5、添加IObjectSafety接口

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

在接口中输入以下代码:

图片 13

注意:这个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)]中开发ActiveX的学习笔记,发布总结。 ref int pdwEnabledOptions);

 

        [PreserveSig()]

        int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);

 

    }

图片 14

图片 15

图片 16

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
//[assembly: Guid("40ec502e-6b66-41f9-860f-ab30339c8e63")]

图片 17

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("");

            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)

        {

 

        }

 

        

    }

}

图片 18

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

 

(3)修改AssemblyInfo.cs,增加[assembly: AllowPartiallyTrustedCallers()],完整内容类似下面这样:

 

第四步:将guid复制到类名前,

4、为控件添加一个方法,用来设置在Label中显示当前时间

1.7、新建一个安装项目

 

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

图片 19

图片 20图片 21代码

生成成功将会生成两个文件:ActiveXDemo.dll和ActiveXDemo.tlb,至此ActiveX浏览器插件制作完成,

[Guid("40ec502e-6b66-41f9-860f-ab30339c8e63")]
    public partial class dirselect : Component, IObjectSafety
    {

  1. /// <summary>
  2.         /// 设置当前时间
  3.         /// </summary>
  4.         /// <param name="timeStr"></param>
  5.         public void SetTime(string timeStr)
  6.         {
  7.             this.label2.Text = timeStr;
  8.         }

1.8、项目输出

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

图片 22

双击箭头所指

图片 23

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

图片 24

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

图片 25

图片 26

以下是如何打包安装ActiveX插件,

第五步:继承IObjectSafety接口

5、新建一个接口:
据说实现该接口的目的就是提高程序的安全性,以便客户端IE在不更改设置的情况下可以预行该ActiveX控件。
关于这个有篇文章,推荐大家看看:

1、打包成CAB文件

 1 using System.Reflection;  2 using System.Runtime.CompilerServices;  3 using System.Runtime.InteropServices;  4 using System.Security;  5   6 // General Information about an assembly is controlled through the following   7 // set of attributes. Change these attribute values to modify the information  8 // associated with an assembly.  9 [assembly: AssemblyTitle("ActiveXDemo")] 10 [assembly: AssemblyDescription("")] 11 [assembly: AssemblyConfiguration("")] 12 [assembly: AssemblyCompany("Microsoft")] 13 [assembly: AssemblyProduct("ActiveXDemo")] 14 [assembly: AssemblyCopyright("Copyright ? Microsoft 2009")] 15 [assembly: AssemblyTrademark("")] 16 [assembly: AssemblyCulture("")] 17 [assembly: AllowPartiallyTrustedCallers()] 18  19 // Setting ComVisible to false makes the types in this assembly not visible  20 // to COM components.  If you need to access a type in this assembly from  21 // COM, set the ComVisible attribute to true on that type. 22 [assembly: ComVisible(true)] 23  24 // The following GUID is for the ID of the typelib if this project is exposed to COM 25 [assembly: Guid("bd585d12-7f22-4b3f-959f-18efbfc53f94")] 26  27 // Version information for an assembly consists of the following four values: 28 // 29 //      Major Version 30 //      Minor Version  31 //      Build Number 32 //      Revision 33 // 34 // You can specify all the values or you can default the Build and Revision Numbers  35 // by using the '*' as shown below: 36 // [assembly: AssemblyVersion("1.0.*")] 37 [assembly: AssemblyVersion("1.0.0.0")] 38 [assembly: AssemblyFileVersion("1.0.0.0")]

我用的InstallShield2010破解版制作安装包

using System.Runtime.InteropServices;

2.1、编写inf文件

[version]  

signature="$CHICAGO$"  

AdvancedINF=2.0  

 

[Setup Hooks]  

hook1=hook1  

 

[hook1]  

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

msi修改成自己的即可

图片 27

新建InstallScript Msi类型工程

[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectSafety
    {
        [PreserveSig]
        void GetInterfaceSafetyOptions(ref Guid riid,
                      [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions,
                      [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
    1. namespace HelloBossma
  5. {
  6.     [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
  7.     [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
  8.     public interface IObjectSafety
  9.     {
  10.         [PreserveSig]
  11.         int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);
    1.         [PreserveSig()]
  12.         int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
  13.     }
  14. }

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

 

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

(4)新建一个IObjectSafety接口文件IObjectSafety.cs,内容如下:

最主要的是在添加文件时候,要把ActiveXDemo.tlb这个文件设为自注册

        [PreserveSig()]
        void SetInterfaceSafetyOptions(ref Guid riid,
                      [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask,
                      [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
    }

6、让我们的控件实现这个接口
关于实现这个接口,篇幅较长,可以在这篇文章找到:

2.3、创建证书和私钥

 

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

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

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

图片 28

 

 

输入两次一样的密码;

图片 29

图片 30图片 31代码

图片 32

给自定义组件类dirselect 继承接口,并实现接口方法:

1、为CAB进行签名

用signcode.exe进行签名

图片 33

在生成安装文件时候,可以选择生成适合网络形式的或者单个安装包,在这里我生成了单个安装包,你也可以选择生成网络的

public partial class dirselect : Component, IObjectSafety

7、为我们的控件添加Guid、ProgId和ComVisible属性

3.1、选择cab文件

图片 34

 1 using System;  2 using System.Collections.Generic;  3 using System.Text;  4 using System.Runtime.InteropServices;  5   6 namespace ActiveXDemo  7 {  8     [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]  9     [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 10     public interface IObjectSafety 11     { 12         [PreserveSig] 13         int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions); 14  15         [PreserveSig()] 16         int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions); 17     } 18  19 }

图片 35

void IObjectSafety.GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
        {
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }
        void IObjectSafety.SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
        {
            throw new Exception("The method or operation is not implemented.");
        }

  1. namespace HelloBossma
  2. {
  3.     [Guid("636B8CE1-7512-464C-B63C-FC75BDCA21DB"), ProgId("HelloBossma.HelloBossmaActiveX"), ComVisible(true)]
  4.     public partial class HelloBossmaActiveX : UserControl, IObjectSafety
  5.     {
  6. ...
  7.     }
  8. }

3.2、选择自定义

图片 36

图片 37

 

第六步,编写自己的函数方法。

8、打开项目属性,在生成里边,勾选【为Com互操作注册】

3.3、选择cer证书

选择刚刚生成的cer证书

图片 38

该内容除命名空间可以更改外,其它内容都是固定的,不要修改 (5)新建一个:Windows Forms-->“用户控件”,我们的主要逻辑就写在这里(还可以在它上面随便放置其它windows常用控件,跟winForm开发一样),不过首先要修改类定义,让其实现我们刚才定义的接口

点击生成安装包按钮,生成后如下:

如我的完整代码如下:

图片 39

3.4、选择秘钥

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

图片 40

图片 41

图片 42图片 43代码

图片 44

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Runtime.InteropServices;

9、生成项目,进入到binRelease目录下可以看到
HelloBossma.dll
HelloBossma.tlb
这两个文件时必须的,否则生成不成功。

3.6、填入数据描述

Windows,

图片 45

图片 46

 

namespace dirselect
{
    [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectSafety
    {
        [PreserveSig]
        void GetInterfaceSafetyOptions(ref Guid riid,
                      [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions,
                      [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

二、制作ActiveX Setup安装文件
1、新建一个安装项目

3.7、时间戳服务器URL

填入免费的时间戳服务器URL 

图片 47

  1 using System;   2 using System.Runtime.InteropServices;   3 using System.Threading;   4 using System.Windows.Forms;   5    6    7 namespace ActiveXDemo   8 {   9     [Guid("8d7d8518-ca58-4863-b94d-3c616fda7b35")]  10     public partial class MyActiveX : UserControl,IObjectSafety  11     {  12         delegate void D(object obj);  13   14         public MyActiveX()  15         {  16             InitializeComponent();  17         }  18   19         #region IObjectSafety 成员  20   21         private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";  22         private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";  23         private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";  24         private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";  25         private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";  26   27         private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;  28         private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;  29         private const int S_OK = 0;  30         private const int E_FAIL = unchecked((int)0x80004005);  31         private const int E_NOINTERFACE = unchecked((int)0x80004002);  32   33         private bool _fSafeForScripting = true;  34         private bool _fSafeForInitializing = true;  35   36         public int GetInterfaceSafetyOptions(ref Guid riid, ref

至此,安装包制作完成,我们点击安装后他会自动注册tlb文件.

        [PreserveSig()]
        void SetInterfaceSafetyOptions(ref Guid riid,
                      [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask,
                      [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
    }

图片 48

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 实现可以跳转到 

 

 

 

 

 

 

 

 

 

以下是如何使用ActiveX插件:

    [Guid("40ec502e-6b66-41f9-860f-ab30339c8e63")]
    public partial class dirselect : Component, IObjectSafety
    {
        private string strSelectedDir = string.Empty;
        private string[] strAllFiles = null;
        private int iFilesCount = 0;

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

新建一个html页面:我取名:TestActiveX.html

        void IObjectSafety.GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
        {
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }
        void IObjectSafety.SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
        {
            throw new Exception("The method or operation is not implemented.");
        }

图片 49

内容如下:

        public dirselect()
        {
            InitializeComponent();
        }

3、打开安装项目的属性页面,设置安装URL
这里设置为:
这个目录必须是实际存在的,用来存放生成的安装文件,供客户端下载安装。

 1 <!DOCTYPE html>
 2 
 3 <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5     <meta charset="utf-8" />
 6     <title></title>
 7     <Script type="text/javascript">
 8         function GetGUID() {
 9           var a=  document.getElementById("ActiveXDemo").GetGUID();
10             alert(a);
11         }
12 
13     </Script>
14 </head>
15 <body>
16     <object id="ActiveXDemo" classid='clsid:C5BD015D-E2AA-4DD3-AEB7-93D7409FA751' width="350" height="350"></object>
17 
18     <input id="Button1" type="button" value="获取guid" onclick="GetGUID()" />
19 </body>
20 </html>

        public dirselect(IContainer container)
        {
            container.Add(this);

4、生成项目
会生成两个文件,一个exe文件和一个msi文件

注意这里的classid要和你的插件上生成的guid一致才可以
查看页面效果:

            InitializeComponent();
        }

5、新建一个网站,添加如下代码到网页中。
其中classid即为控件的Guid。

图片 50

        /// <summary>
        /// 选择文件夹
        /// </summary>
        /// <returns>是否选择了</returns>
        public string showDlg()
        {
            folderBrowserDialog1.Description = "请选择需要上传的文件夹:";
            if (folderBrowserDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                strSelectedDir = folderBrowserDialog1.SelectedPath;

  1. <object classid="clsid:636B8CE1-7512-464C-B63C-FC75BDCA21DB" codebase="hellobossma/setup.exe#version=1,0,0,0" width="200" height="40" id="helloBossma">
  2. </object>

图片 51

                strAllFiles = System.IO.Directory.GetFiles(strSelectedDir, "*", System.IO.SearchOption.AllDirectories);

6、将安装项目生成的exe和msi文件拷贝到网站hellobossma目录中。
HelloBossmaSetup.msi
setup.exe

到此,结束,关于用InstallShield制作安装包的详细过程,请自行学习.

                iFilesCount = strAllFiles.Length;
                return strSelectedDir;
            }

7、启动网站,确保访问setup.exe的目录与【安装项目】中的【安装URL】一致。

 

            return string.Empty;
        }

8、一般情况下,网页会弹出提示,是否安装ActiveX控件等,如果提示了也不能安装,需要将网站添加到信任站点,并允许下载不安全和未签名控件。关于控件的签名和认证,本文不做说明,需要的请自行搜索。

        /// <summary>
        /// 返回选择的文件夹
        /// </summary>
        /// <returns></returns>
        public string GetSelctedDir()
        {
            return strSelectedDir;
        }

图片 52

        /// <summary>
        /// 返回该文件夹下所有文件数目
        /// </summary>
        /// <returns></returns>
        public int GetFilesCount()
        {
            return iFilesCount;
        }

使用这种安装方法,会在客户端弹出安装软件的界面,对客户来说,不太友好。

        ////返回该文件夹下所有文件路径
        //public string[] GetFiles()
        //{
        //    string[] FileInfos = System.IO.Directory.GetFiles(strSelectedDir, "*", System.IO.SearchOption.AllDirectories);
        //    return FileInfos;   
        //}

三、制作ActiveX CAB安装包
尝试了VS中的【CAB项目】模板,但是不幸的是,控件怎么也安装不上,放弃。
在网上看到很多人使用CABARC.EXE,试了一下,居然成功了,特将过程记录下来。

        //返回该文件夹下所有文件路径中的第ige
        public string GetFile(int i)
        {
            return strAllFiles[i];
        }
    }
}

1、下载这个程序包,可以从微软下载,地址:

解压这个文件,里边有详细的使用说明。

最后生成dll。这样acticex就做好了。

2、【开始】-【运行】,输入“CMD”,在打开的命令提示符界面中,进入解压后文件的BIN目录,

 

这里需要加入两个文件:
HelloBossmaSetup.msi
install.inf

测试发布

HelloBossmaSetup.msi 是上边的安装项目生成的安装程序。
install.inf是一个文本文件,指定运行控件所需要下载或者呈交的文件。

第一步:新建一个web网站项目,修改项目属性,生成到iis

关于inf文件的书写规范,这里不做介绍,有需要的可以自己搜一下。
这个例子中install.inf文件的内容

第二步:在主页中添加html代码

  1. [version]
  2. signature="$CHICAGO$"
  3. AdvancedINF=2.0
    1. [Setup Hooks]
  4. hook1=hook1
    1. [hook1]
  5. run=msiexec.exe /i "%EXTRACT_DIR%HelloBossmaSetup.msi" /qn

<html xmlns="" >
<body color = white><hr><font face = arial size = 1>
<OBJECT id = "dirselect1" name = "dirselect1"  codebase="setup.exe" classid = "clsid:40ec502e-6b66-41f9-860f-ab30339c8e63" >
</OBJECT>
</font>
<form name = "frm" id = "frm" ><input type = button value = "选择文件夹" onClick ="doScript(); ">
</form>
<hr>
</body>

有了这两个文件,运行下边的命令,成功的话会在当前目录生成HelloBossma.cab文件。

<script language = "javascript">
function doScript()
{
 var t = dirselect1.showDlg();
 alert(t);
 if(t!="")
 {
  
  var i=0;
  var cnt = dirselect1.GetFilesCount();
  alert(cnt);  
  
  var array = new Array(cnt);

图片 53

  for(i;i<3;i )
  {
   array[i] = dirselect1.GetFile(i);
   alert(array[i]);
  }
    
 }  

3、把这个文件放到控件下载目录中,然后修改网页中的调用方式。

}
</script>
</html>

  1. <object classid="clsid:636B8CE1-7512-464C-B63C-FC75BDCA21DB" codebase="hellobossma/HelloBossma.CAB" width="442" height="49" id="helloBossma">
  2. </object>
  3. <input type="button" value="Click" onclick="helloBossma.SetTime((new Date()).getTime())" />

csid还是那个assemblyInfo文件中的guid,codebase是下面安装程序工程生成的exe文件,注意你必须将他们拷贝到虚拟目录根目录下,和你发布的url一致,意思是当客户端没有安装这个activex控件的时候,就会查找安装程序,并根据你的发布地址去下载安装。

这里还添加了一个按钮,点击时触发一个事件,调用控件的显示时间方法,点击按钮,你会发现控件上时间的变化。

打包发布

图片 54

(几种方法实验没成功,有的是缺少工具,有的是不想做,有的是没实验成,最后采用vs2005安装程序生成的安装包)

OK,这篇文章到这里正文就结束了。
只是简单了解下使用C#开发ActiveX控件,很多东西还没弄清楚,有问题的话,欢迎提出来。

第一步:vs2005新建一个“安装程序”,将其加入到前面那个dll解决方案中

点“应用程序文件夹”-添加-“项目输出”,点击确定就可以了,默认是选择了前面那个dll工程

第二步:配置。项目属性中修改“安装URL”,这个地址应该是你发布的地址。

第三步,生成

这样就得到了安装包setup.exe和相应的msi文件。

测试

浏览器Internet选项中安全级别需要自定义,“对没有标记为安全的...”提示,这样就不会看不到安装程序了。因为有一步数字签名的我没有去弄,所以会提示“未知...”,这个待学习。

费了九牛二虎之力才弄出来,得知如果是用vs2005制作的acticex控件是要安装.net framework才能运行,还是改用vb或者vc制作算了。

给 .cab 文件签名

1. setreg 1 true
2. makecert newCert.cer -sv privatekey.pvk
生成 newCert.cer 和 privatekey.pvk 两个文件
3. Cert2Spc newCert.cer newCert.spc
4. signtool signwizard
有图形界面的签名向导,按提示指定有关文件路径即可,其中的描述是控件的描述。

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:中开发ActiveX的学习笔记,发布总结

关键词: