码迷,mamicode.com
首页 > Windows程序 > 详细

VS 2012 C#ActiveX控件开发总结

时间:2016-04-22 13:20:48      阅读:831      评论:0      收藏:0      [点我收藏+]

标签:

ActiveX 控件以前也叫做OLE 控件或OCX 控件,它是一些软件组件或对象,可以将其插入到WEB 网页或其它应用程序中。使用ActiveX 插件,可以轻松方便的在Web 页中插入多媒体效果、交互式对象以及复杂程序等等。通常使用C++或VB 开发ActiveX 控件,本文探讨一下在Visual Studio 2012 环境中使用C#开发ActiveX 控件的技术实现。

一、ActiveX控件的开发

1、新建一个空白的解决方案

技术分享

2、在解决方案上右击→添加→新建项目→Visual C#→Windows→Windows窗体控件库,输入名称为ActiveX。

技术分享

       点击确定,生成一个名为UserControl1的控件,继承自UserControl类,在上面拖一个按钮,并写入事件响应代码:

技术分享 技术分享

3、在新建的ActiveX控件库上右键→属性→应用程序→程序集信息→使程序集COM可见(M)。再切换到“生成”标签→勾选“为COM互操作注册”。

技术分享

 

技术分享

 

技术分享

4、修改ActiveX的AssemblyInof.cs文件,添加如下代码:

技术分享

5、为Control1.cs添加内容

添加命名空间using System.Runtime.InteropServices;

为控件创建GUID:工具→创建GUID,选个5,点击复制!

技术分享

将GUID号粘贴到ActiveX.cs中,如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Drawing;
 5 using System.Data;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 using System.Runtime.InteropServices;
11 
12 namespace ActiveX
13 {
14     [Guid("D4176A17-2A33-4903-8F37-9EBDD7CAFFD3")]
15     public partial class UserControl1: UserControl
16     {
17         public UserControl1()
18         {
19             InitializeComponent();
20         }
21 
22         private void button1_Click(object sender, EventArgs e)
23         {
24             MessageBox.Show("Hello, GeoStorm!");
25         }
26     }
27 }

6、为了让ActiveX 控件获取客户端的信任, 控件类还需要实现一个名为“IObjectSafety”的接口。(注意:不能修改该接口的GUID 值)。

 

       创建接口:右键ActiveX 工程—>添加—>新建项→Visual C#项→接口

技术分享

代码如下:

 

[csharp] view plain copy
 
 技术分享技术分享
  1. using System;  
  2. using System.Runtime.InteropServices;  
  3. namespace ActiveXDemo  
  4. {  
  5.       
  6.   
  7.     [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]//固定不变的  
  8.     [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]  
  9.     public interface IObjectSafety  
  10.     {  
  11.         [PreserveSig]  
  12.         int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);  
  13.   
  14.         [PreserveSig()]  
  15.         int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);  
  16.     }  
  17. }  

然后在控件类中集成并实现接口:

 

[csharp] view plain copy
 
 技术分享技术分享
  1. using System;  
  2. using System.Windows.Forms;  
  3.   
  4. namespace ActiveXTest  
  5. {  
  6.     using System.Runtime.InteropServices;  
  7.   
  8.     [Guid("D4176A17-2A33-4903-8F37-9EBDD7CAFFD3"), ProgId("ActiveXDemo.UserControl1"), ComVisible(true)]  
  9.     public partial class UserControl1: UserControl,IObjectSafety  
  10.     {  
  11.          
  12.         #region IObjectSafety 成员 格式固定  
  13.   
  14.         private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";  
  15.         private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";  
  16.         private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";  
  17.         private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";  
  18.         private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";  
  19.   
  20.         private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;  
  21.         private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;  
  22.         private const int S_OK = 0;  
  23.         private const int E_FAIL = unchecked((int)0x80004005);  
  24.         private const int E_NOINTERFACE = unchecked((int)0x80004002);  
  25.   
  26.         private bool _fSafeForScripting = true;  
  27.         private bool _fSafeForInitializing = true;  
  28.   
  29.         public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)  
  30.         {  
  31.             int Rslt = E_FAIL;  
  32.   
  33.             string strGUID = riid.ToString("B");  
  34.             pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;  
  35.             switch (strGUID)  
  36.             {  
  37.                 case _IID_IDispatch:  
  38.                 case _IID_IDispatchEx:  
  39.                     Rslt = S_OK;  
  40.                     pdwEnabledOptions = 0;  
  41.                     if (_fSafeForScripting == true)  
  42.                         pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;  
  43.                     break;  
  44.                 case _IID_IPersistStorage:  
  45.                 case _IID_IPersistStream:  
  46.                 case _IID_IPersistPropertyBag:  
  47.                     Rslt = S_OK;  
  48.                     pdwEnabledOptions = 0;  
  49.                     if (_fSafeForInitializing == true)  
  50.                         pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;  
  51.                     break;  
  52.                 default:  
  53.                     Rslt = E_NOINTERFACE;  
  54.                     break;  
  55.             }  
  56.   
  57.             return Rslt;  
  58.         }  
  59.   
  60.         public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)  
  61.         {  
  62.             int Rslt = E_FAIL;  
  63.             string strGUID = riid.ToString("B");  
  64.             switch (strGUID)  
  65.             {  
  66.                 case _IID_IDispatch:  
  67.                 case _IID_IDispatchEx:  
  68.                     if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))  
  69.                         Rslt = S_OK;  
  70.                     break;  
  71.                 case _IID_IPersistStorage:  
  72.                 case _IID_IPersistStream:  
  73.                 case _IID_IPersistPropertyBag:  
  74.                     if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))  
  75.                         Rslt = S_OK;  
  76.                     break;  
  77.                 default:  
  78.                     Rslt = E_NOINTERFACE;  
  79.                     break;  
  80.             }  
  81.   
  82.             return Rslt;  
  83.         }  
  84.  
  85.         #endregion  
  86.           
  87.   
  88.         public UserControl1()  
  89.         {  
  90.             InitializeComponent();  
  91.         }  
  92.   
  93.         private void button1_Click(object sender, EventArgs e)  
  94.         {  
  95.             MessageBox.Show("Hello, GeoStorm");  
  96.         }  
  97.     }  
  98. }  

这样,一个ActiveX控件就开发完了!

 二、ActiveX控件的部署

添加打包部署项目(VS2012需要单独安装InstallShield 2015 Limited Edition,并输入序列号),添加主输出,将其Register 属性设置为vsdrpCOM,完成后生成,本过程略过。

三、测试

1、新建web应用:

       文件→新建→项目→Visual C#→Web→ASP.NET空Web应用程序→WebApplication1→添加到解决方案。

 技术分享

 

2、添加Web页面

        右键→添加→Web窗体

[csharp] view plain copy
 
 技术分享技术分享
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>  
  2.   
  3. <!DOCTYPE html>  
  4.   
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6. <head runat="server">  
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  8.     <title></title>  
  9. </head>  
  10. <body>  
  11.     <div>  
  12.     <object id="ActiveX" classid="clsid:0973CD43-BED3-4468-86E9-B0D2344F54D6" codebase="test.cab"></object>  
  13.     <input type="button" onclick="alert(ActiveX.ForDefault());" value=" 提交( 前台调用控件方法)" />  
  14.     </div>  
  15. </body>  
  16. </html>  

3、在IE浏览器中查看效果

技术分享

四、ActiveX控件打包(.cab)与客户端自动安装

VS 2012 C#ActiveX控件开发总结

标签:

原文地址:http://www.cnblogs.com/GeoStorm/p/5420815.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!