最近公司项目涉及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文件,系统将提示安装控件,安装后的效果如下图所示: