随笔-55  评论-264  文章-1  trackbacks-1

Create an ActiveX using a Csharp Usercontrol

http://www.codeguru.com/csharp/.net/net_general/comcom/article.php/c16257
Create an ActiveX using a Csharp Usercontrol
Rating: none

Andreas Verhamme (view profile)
July 20, 2009

Environment:  Visual Studio 2005 C#

This article is about creating ActiveX controls using a DotNet Usercontrol in Csharp. You can design all ActiveX features like: properties, methods and events.


(continued)




Environment:  Visual Studio(2005) Csharp

How to Do This

1. Create a Usercontrol using Visual Studio (C#):


(

Full Size Image)

2. Configure the project properties:


(Full Size Image)

3. Modify the usercontrol interface:

Note: Make sur you added the EVENTS class:   [ClassInterface(ClassInterfaceType.AutoDual), 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. Add the register/unregister section in the source code

// 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. Add an ActiveX property:

// ActiveX properties (Get/Set) //////////////////////////////////////////////////////////////////

private int ptextVal;
public int TextVal
{
      
get
       {
                  ptextVal = (
int)(numericUpDown1.Value);
                 
return ptextVal;
        }
       
se
t
       {

            ptextVal = value;
                numericUpDown1.Value = ptextVal;
         }
}

 

 

 

6. Add an ActiveX method:

// 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. Add an ActiveX event:

// 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. Register the ActiveX on your PC:

Register the new ActiveX on your computer using the command:  RegAsm.exe CsharpWindowsActiveX.dll

9. Test your ActiveX:

Use the TSTCon32.exe tool from Visul Studio to test the ActiveX:


(Full Size Image)


(Full Size Image)

 

Downloads

  • CsharpWindowsActiveX_demo.zip - demo project
  • CsharpWindowsActiveX_src.zip - source code
  • posted on 2009-07-29 16:12 jannock 阅读(263) 评论(3) 编辑 收藏

    评论:
    #1楼 2009-07-30 00:09 | 萧萧空间      
    很好,学习了。
     回复 引用 查看   
    #2楼[楼主] 2009-07-31 14:53 | jannock      
    @萧萧空间
    转载的,算是笔记

     回复 引用 查看   
    #3楼[楼主] 2009-09-28 21:09 | jannock      
    xxxxxxxxxxxx
     回复 引用 查看   
    昵称:jannock
    园龄:3年10个月
    粉丝:7
    关注:1
    <2009年7月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    搜索

     

    常用链接

    随笔分类

    随笔档案

    .NET

    常用

    积分与排名

    • 积分 - 138568
    • 排名 - 700

    最新评论

    阅读排行榜

    评论排行榜

    推荐排行榜