C#制作ActiveX插件


  1. 首先新建項目--->類庫,取名:ActiveXDemo
  2. 右鍵項目屬性:應用屬性==>程序集信息=>使程序集Com可見,
  3. 生成==>輸出==>為com互操作注冊
  4. 新建接口類取名: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 }

新建用戶控件取名:UserControl1,UserControl1繼承自上面新建的接口IObjectSafety,並實現接口(實現接口的方法請復制下面的內容),在類UserControl1添加Guid特性值,利用VS的工具生成guid

 

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
    }
}


進行簡單界面布局:

點擊按鈕效果見上面代碼,還可自己寫一個公共方法,我寫的是GetGUID(),

 

生成成功將會生成兩個文件:ActiveXDemo.dll和ActiveXDemo.tlb,至此ActiveX瀏覽器插件制作完成,

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

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

新建InstallScript Msi類型工程

最主要的是在添加文件時候,要把ActiveXDemo.tlb這個文件設為自注冊

在生成安裝文件時候,可以選擇生成適合網絡形式的或者單個安裝包,在這里我生成了單個安裝包,你也可以選擇生成網絡的

 

點擊生成安裝包按鈕,生成后如下:

 

至此,安裝包制作完成,我們點擊安裝后他會自動注冊tlb文件.

以下是如何使用ActiveX插件:

新建一個html頁面:我取名:TestActiveX.html

內容如下:

 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>

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

到此,結束,關於用InstallShield制作安裝包的詳細過程,請自行學習.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM