C# 创建ActiveX
第一步:创建一个window窗体控件库。设置程序集信息,打开vs2010 GUID生成器生成GUID:
<!--StartFragment -->
?

using?System.Reflection;using?System.Runtime.CompilerServices;using?System.Runtime.InteropServices;using?System.Security;//自己添加?using?System; //?有关程序集的常规信息通过以下//?特性集控制。更改这些特性值可修改//?与程序集关联的信息。[assembly:?AssemblyTitle("LoginActiveX.Controls")][assembly:?AssemblyDescription("")][assembly:?AssemblyConfiguration("")][assembly:?AssemblyCompany("Orifound")][assembly:?AssemblyProduct("LoginActiveX.Controls")][assembly:?AssemblyCopyright("Copyright???Orifound?2011")][assembly:?AssemblyTrademark("")][assembly:?AssemblyCulture("")] //自己添加?[assembly:?AllowPartiallyTrustedCallers()] //?将?ComVisible?设置为?false?使此程序集中的类型//?对?COM?组件不可见。如果需要从?COM?访问此程序集中的类型,//?则将该类型上的?ComVisible?特性设置为?true。[assembly:?ComVisible(true)] //注意: 此属性设置为true //?如果此项目向?COM?公开,则下列?GUID?用于类型库的?ID[assembly:?Guid("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值:主句话没弄明白,我每次都是自己生成的):
[ComImport,?Guid("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?:?UserControl,?IObjectSafety????{????????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.filesRegisterOCXs=RegisterFilesAddReg=AddToRegistry [RInstallApplicationFiles]CopyFiles=install.filesRegisterOCXs=RegisterFilesAddReg=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=thiscabRegisterServer=yesclsid={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 -->

[Guid("F51A8749-E7A7-4F76-A82A-7D860C788663")]public?partial?class?LoginContorl?:?UserControl,?IObjectSafety编写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的签名将在另一篇里面将。