VS2010 C#创建和发布ActiveX控件

最近公司项目涉及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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vs2010 中添加 ActiveX Control Test Container工具(转载) vs2010中的TSTCON( ActiveX Control Test Container )工具非自动安装,而是作为一个例程提供。所以应找到该例程,并编译: 如vs2010安装在默认路径则 1, 进入:C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033,可找到VC2010Samples.zip文件, 2, 将其解决到同一个文件夹,解压后将出现一个C++子文件夹。 3, TstCon例程在:C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033\C++\MFC\ole\TstCon,双击其中的.sln文件启动工程,直接编译, 4, 编译后在Debug子文件夹中将出现一个TstCon.exe文件,将其复制到:C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools文件夹。 5, 在vs2010中的Tools菜单点击“External Tools...”,出现如下对话框,点击“Add”添加一项工具。 6, 新工具项的"Title"为:ActiveX Control Test Container,"Command"为:C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\TstCon.exe。 7, 确认退出对话框,Tools菜单将出现“ActiveX Control Test Container”菜单项。完毕! 同理在2015安装目录下找到并编译: 但是编译的时候需要区分win32和x64的不同平台生成的工具 分别添加 ActiveX Control Test Container 32和 ActiveX Control Test Container 64的工具,因为不同工具显示的是不同平台注册的com组件,比如你注册一个32位的com组件,此时只能用ActiveX Control Test Container 32测试,而在ActiveX Control Test Container 64中是找不到这个com组件的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值