文章:Create an ActiveX using a Csharp Usercontrol
来源:http://www.codeguru.com/csharp/.net/net_general/comcom/article.php/c16257
原著作者:Andreas Verhamme
翻译:Dezai

这篇文章主要是介绍如何在C#中如何使用DotNet的用户控件来创建ActiveX控件.你可以设计ActiveX的相关属性,方法和事件.

开发环境:Visual Studio2005





1.使用Visual Studio创建一个用户控件




2.设置程序集Assebmly的相关属性







3.修改用户控件的接口设计

注意:务必确认增加下面这个事件类

程序代码 程序代码

ComSourceInterfaces(typeof(UserControlEvents))]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
// Add references
using System.Runtime.InteropServices;
using System.Reflection;
using Microsoft.Win32;
namespace CsharpWindowsActiveX
{
            [ProgId("CsharpWindowsActiveX.ActiveXUserControl")]
            [ClassInterface(ClassInterfaceType.AutoDual), ComSourceInterfaces(typeof(UserControlEvents))]
            public partial class ActiveXUserControl : UserControl
            {
                    public ActiveXUserControl()
                    {
                         InitializeComponent();
                    }
                     .....



4..在源码中增加注册/注销功能部分的代码

程序代码 程序代码

// register COM ActiveX object
[ComRegisterFunction()]
public static void RegisterClass(string key)
{
               StringBuilder skey = new StringBuilder(key);
              skey.Replace(@"HKEY_CLASSES_ROOT\", "");
              RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(skey.ToString(), true);
              RegistryKey ctrl = regKey.CreateSubKey("Control");
             ctrl.Close();
              RegistryKey inprocServer32 = regKey.OpenSubKey("InprocServer32", true);
              inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
              inprocServer32.Close();
              regKey.Close();
}

[ComUnregisterFunction()]
public static void UnregisterClass(string key)
{
               StringBuilder skey = new StringBuilder(key);
               skey.Replace(@"HKEY_CLASSES_ROOT\", "");
               RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(skey.ToString(), true);
               regKey.DeleteSubKey("Control", false);
               RegistryKey inprocServer32 = regKey.OpenSubKey("InprocServer32", true);
               regKey.DeleteSubKey("CodeBase", false);
               regKey.Close();
}




5.增加一个ActiveX属性

程序代码 程序代码

/ ActiveX properties (Get/Set) //////////////////////////////////////////////////////////////////
private int ptextVal;
public int TextVal
{
       get
       {
                  ptextVal = (int)(numericUpDown1.Value);
                  return ptextVal;
        }
        set
       {
            ptextVal = value;
                numericUpDown1.Value = ptextVal;
         }
}



6.增加一个ActiveX方法
程序代码 程序代码

/ ActiveX methods/functions //////////////////////////////////////////////////////////////////
public interface ICOMCallable

{
             int GetTextBoxValue();
}
public int GetTextBoxValue()
{
             int i = (int)(numericUpDown1.Value);
             MessageBox.Show("ActiveX method: GetTextBoxValue " + i.ToString());
             return (i);
}



7.增加一个ActiveX事件

程序代码 程序代码

// Eventhandler interface //////////////////////////////////////////////////////////////////
  
public delegate void ControlEventHandler(int NumVal);
[Guid("0A415E38-372F-45fb-813B-D9558C787EA0")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

public interface UserControlEvents
{
               [DispId(0x60020001)]
               void OnButtonClick(int NumVal);
}

public event ControlEventHandler OnButtonClick;

private void buttonOK_Click(object sender, EventArgs e)
{
        int NumVal;
        if (OnButtonClick != null)
        {
                 NumVal = (int)(numericUpDown1.Value);
                 OnButtonClick(NumVal);
         }
}






8.在PC机上注册这个ActiveX

使用RegAsm.exe CsharpWindowsActiveX.dll命令在你的电脑上注册这个新的ActiveX控件




9.测试你的ActiveX

使用TSTCon32.exe tool在Visul Studio 中测试ActiveX







posted on 2009-08-31 10:15  德仔  阅读(454)  评论(0编辑  收藏  举报