VS2010 C#创建和发布ActiveX控件

来源:互联网 发布:试点网络学校基础 编辑:程序博客网 时间:2024/04/29 18:48

最近公司项目涉及ActiveX控件,于是查找网络资源,发现此类文章比较多,但是很多文章都讲的不是很清楚,理解起来有点模糊。最近正好有空,就写这篇文章。ActiveX的相关理论就不再论述,各位看官可以在百度或者必应了解。文章只描述VS2010中C#用户控件方式创建与发布ActiveX控件,比较肤浅,希望可以帮到各位看官。谢谢。

1、启动VS2010,界面如下图所示:

2、新建“类库”项目TestActiveXControl,可以删除项目中自动生成的Class1.cs文件,界面如下图所示:

3、修改项目的属性,点击“程序集信息”按钮,弹出程序集信息对话框,勾选“使程序集COM可见”选项。界面如下图所示:

4、点击“生成”选项卡,勾选“为COM互操作注册”选项,保存当前配置。界面如下图所示:

5、添加“接口”类文件,并命名为IObjectSafety。界面如下图所示:

6、添加以下代码,代码中类容无需修改。

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

using System.Runtime.InteropServices;

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

7、新建“用户控件”文件,在控件设计界面布局自己的界面。本示例添加了两个名称分别为“继续”和“退出”的按钮。将用户控件类实现接口IObjectSafety,其接口代码如下:

    #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 intINTERFACESAFE_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

注意:具体信息参考文献:http://www.pinvoke.net/default.aspx/Interfaces/IObjectSafety.html

8、实现自己布局的控件的功能。本实例为两个按钮分别添加了点击事件响应函数,结果分别为显示按钮名称的消息提示框。

9、重要环节,在用户控件类上面为其添加Guid、ProgId、ComVisibale属性,代码如下:其中,Guid可以利用VS自带工具上生成。

[Guid("F65B8221-4C41-4D9B-BA11-8127836CA796"),ProgId("TestActiveXControl.MyUserControl"), ComVisible(true)]

10、首先生成解决方案;然后为项目添加“安装项目”,界面如下图所示:

11、首先为安装项目添加“项目输出”;然后选择“主输出”以及配置安装包的安装目录;最后为安装项目“生成”安装文件。界面如下图所示:

12、首先部署本地机器的IIS服务器;然后接下来就是新建网页用来访问控件,然后网页提示安装该控件。利用Microsoft ActiveX Control Pad编辑网页文件十分方便,代码代码如下:

<HTML>
<HEAD>
<TITLE>TestActiveXControl测试</TITLE>
</HEAD>
<BODY>
<object  id="TestActiveXControl" classid="clsid:F65B8221-4C41-4D9B-BA11-8127836CA796"codebase="TestActiveXControl/setup.exe" width="200"height="200"></object>
</BODY>
</HTML>

将该HTM文件放置到IIS服务器的C:\inetpub\wwwroot目录下。使用IE浏览器打开该HTM文件,系统将提示安装控件,安装后的效果如下图所示:

0 1
原创粉丝点击