C# 创建ActiveX

第一步:创建一个window窗体控件库。设置程序集信息,打开vs2010 GUID生成器生成GUID:

<!--StartFragment -->

 
勾选为com互操作注册,最好在debug和release下面都勾选(注意,此处如果是在debug状态下修改的,那在调到release状态下还需要再设置一次:
<!--StartFragment -->
打开AssemblyInfo.cs文件,添加:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;//自己添加 

using System;
 
// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assemblyAssemblyTitle("LoginActiveX.Controls")]
[assemblyAssemblyDescription("")]
[assemblyAssemblyConfiguration("")]
[assemblyAssemblyCompany("Orifound")]
[assemblyAssemblyProduct("LoginActiveX.Controls")]
[assemblyAssemblyCopyright("Copyright © Orifound 2011")]
[assemblyAssemblyTrademark("")]
[assemblyAssemblyCulture("")]
 
//自己添加 
[assemblyAllowPartiallyTrustedCallers()]
 
 
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assemblyComVisible(true)]  //注意: 此属性设置为true

 
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assemblyGuid("4498e10b-8c59-4eec-bd0a-139fe2c7e65b")]//注意:为刚刚生成的Guid


 
// 程序集的版本信息由下面四个值组成:
//
//      主版本
//      次版本 
//      内部版本号
//      修订号
//
// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVe 
第二步,添加自己的控件了,添加一个用户控件,打开GUID生成器为控件生成GUID:
[Guid("F51A8749-E7A7-4F76-A82A-7D860C788663")]
public partial class LoginContorl : UserControl
 其次,为了让ActiveX控件获得客户端的信任,控件类还需要实现一个名为“IObjectSafety”的接口,要创建该接口(注意,不能修改该接口的GUID值),IObjectSafety代码如下(注意,不能修改该接口的GUID值:主句话没弄明白,我每次都是自己生成的):
[ComImportGuid("33F072D8-BFD7-4E80-B667-B63BFF64BE57")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
    [PreserveSig()]
    void GetInterfacceSafyOptions(
    int riid,
    out int pdwSupportedOptions,
    out int pdwEnabledOptions);
 
    [PreserveSig()]
    void SetInterfaceSafetyOptions(
    int riid,
    int dwOptionsSetMask,
    int dwEnabledOptions);
}
注意这里要添加引用:using System.Runtime.InteropServices;
修改控件类,使之继承IObjectSafety接口,代码清单如下:
<!--StartFragment -->
 
    [Guid("F51A8749-E7A7-4F76-A82A-7D860C788663")]
    public partial class LoginContorl : UserControlIObjectSafety
    {
        public LoginContorl()
        {
            InitializeComponent();
        }
 
        #region IObjectSafety 成员
 
        public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
        {
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }
 
        public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
        {
            throw new NotImplementedException();
        }
 
        #endregion
 
        private void btOk_Click(object sender, EventArgs e)
        {
            MessageBox.Show("用户名: " + tbUserName.Text.Trim() +"  密码: " + tbPWD.Text.Trim());
        }
    }              
到此为止控件开发完成。
第三步,打包发布。我们使用IExpress打包成CAB文件,下面提供中文版下载。
编写INF文件,对于INF文件这里不做介绍,因为本人对这些东西没做深入研究,关于这方面的文章应该很多。
;LoginActiveX.dll 的 INF 文件
;DestDir 可以为 10 则在 Windows 目录,为 11 则在 Windows\System(32) 目录,或为空则在 Occache 目录。
 
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
 
[DefaultInstall]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
AddReg=AddToRegistry
 
[RInstallApplicationFiles]
CopyFiles=install.files
RegisterOCXs=RegisterFiles
AddReg=AddToRegistry
 
[DestinationDirs]
install.files=11
 
[SourceDisksNames]
1=%DiskName%,LoginActiveX.CAB,1
 
[Add.Code]
LoginActiveX.dll=LoginActiveX.dll
 
[install.files]
LoginActiveX.dll=LoginActiveX.dll
 
[SourceDisksFiles]
LoginActiveX.dll=1
 
[LoginActiveX]
file-win32-x86=thiscab
RegisterServer=yes
clsid={F51A8749-E7A7-4F76-A82A-7D860C788663}
DestDir=11 
FileVersion=1,0,0,0
 
[Setup Hooks]
AddToRegHook=AddToRegHook
 
[AddToRegHook]
InfSection=DefaultInstall2
 
[DefaultInstall2]
AddReg=AddToRegistry
 
[AddToRegistry]
HKLM,"SOFTWARE\Classes\CLSID\{F51A8749-E7A7-4F76-A82A-7D860C788663}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}"
HKCR,"Licenses",,,"Licensing: Copying the keys may be a violation of established copyrights."
 
[RegisterFiles]
%11%\LoginActiveX.dll
找到编译生成的dll文件,此时打包需要两个文件(如果有其他DLL依赖文件也需写入INF文件):
<!--StartFragment -->
运行IExpress选择【创建新的自解压向导文件】-【仅创建压缩文件(ActiveX Installs)】-【将上图两个文件添加进去】-【选择生成文件的保存路径】-【点击下一步完成操作】
第四步,使用制作好的ActiveX
找到控件的GUID
[Guid("F51A8749-E7A7-4F76-A82A-7D860C788663")]
public partial class LoginContorl : UserControlIObjectSafety
编写HTML代码:
<object id="myLib" classid="clsid:F51A8749-E7A7-4F76-A82A-7D860C788663" codebase="Login.CAB" width="600" height="200"></object>
classid即为控件的Guid,codebase为CAB文件的路径。
运行HTML文件即可。
至于ActiveX与javascript之间的交互和ActiveX的签名将在另一篇里面将。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值