C/S封装Activex或者OCX插件

1.新建个项目,然后添加类库,添加类库,如图:

2.在Assemblyinfo.cs里添加:

 [assembly: AllowPartiallyTrustedCallers()]   //此处是新增加的

3.添加接口类:IObjectSafety,代码:

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

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

 

4.在添加一个用户控件,在页面进行布局:

5.在用户控件代码中,添加代码如下:

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

namespace OCX
{
    [Guid("8d7d8518-ca58-4863-b94d-3c616fda7b35")]//此为对外开放,最终被调用的ClassID
    public partial class ActiveX : UserControl, IObjectSafety
    {
        delegate void D(object obj);
        public ActiveX()
        {
            InitializeComponent();
        }
        #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 string GetString()
        {
            return DateTime.Now.ToString();
        }

        public DateTime GetDateTime()
        {
            return DateTime.Now;
        }

        public string[] GetStringArray()
        {
            return "H,e,l,l,o".Split(',');
        }

        public int GetInt()
        {
            return 1;
        }

        public double GetDouble()
        {
            return 1.0;
        }

        public Guid GetGuid()
        {
            return Guid.NewGuid();
        }

        public object GetList()
        {
            return listBox1;
        }

        public string GetListItems()
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < listBox1.Items.Count; i++)
            {
                sb.Append("{item:'" + listBox1.Items[i].ToString() + "'},");
            }
            return "[" + sb.ToString().Trim(',') + "]";
        }

        public void Start(object obj)
        {
            for (int i = 0; i < 10; i++)
            {
                Thread t = new Thread(new ParameterizedThreadStart(ShowTime));
                t.Start(obj.ToString() + ",线程:" + i.ToString());
            }
        }
        void ShowTime(object obj)
        {
            if (this.listBox1.InvokeRequired)
            {
                D d = new D(DelegateShowTime);
                listBox1.Invoke(d, obj);
            }
            else
            {
                this.listBox1.Items.Add(obj);
            }


        }


        void DelegateShowTime(object obj)
        {
            this.listBox1.Items.Add(obj);
        }

      
        private void buttonX1_Click(object sender, EventArgs e)
        {
            Start("Hello World");
        }
    }
}

 

 6.安装部署

      1.添加一个安装部署项目,如图:

  

   2.会出现下面的页面,选择项目输出,如图:

 

 

 3.选择项目为自己的项目名称

4.右键主输出来自XX(活动),出现如下画面,在Register选择 vsdrpCom选项

5.重新生成安装部署程序,在Debug或者Release中找到安装文件,进行安装,安装完毕后,进行调用,classid为程序内部类的GUID,Html如下:

 

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>调用ocx页面</title>
    
        
 <script type="text/javascript">
  var fnTest = function(){
    var x = document.getElementById("x");
     x.Start("这是js中的参数");
  }
 </script>
</head>
<body>
    <form id="form1" runat="server">
 <object id="x" classid="clsid:8d7d8518-ca58-4863-b94d-3c616fda7b35"></object>  

    </form>
</body>
</html>

 附上源码:下载

posted @ 2014-06-19 16:25  寻找灯塔ing  阅读(363)  评论(0)    收藏  举报