首页 > 学院 > 开发设计 > 正文

C#ActiveX控件开发学习

2019-11-17 03:14:20
字体:
来源:转载
供稿:网友
C#ActiveX控件开发学习

一:C#ActiveX控件开发注意事项

1:C#开发的ActiveX控件只可在装有Framework的系统上才能用。2:只有IE浏览器支持。3:初次安装需要导入代码签名证书及其证书链的方式,或者Windows其实默认内置了一些权威的CA机构证书,可以向这些机构申请一份代码签名证书及私钥文件来对ActiveX控件签名,这样就可以避免该问题了。但是,向权威的CA机构申请证书是需要付费的,所以需要权衡成本和易用性后,再做出选择。

二:开发步骤

ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力。通常ActiveX控件都是用C++或VB语言开发,本文介绍另一种方式,在.NET Framework平台上,使用C#语言开发ActiveX控件。

1:必须继承并实现IObjectSafety接口

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

2:通常我们会先定义这么一个控件基类去实现改接口

ActiveXControl控件基类

public abstract class ActiveXControl : 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 int INTERFACESAFE_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:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表