Create an ActiveX using a Csharp Usercontrol

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.


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





Environment:
 
Visual Studio(2005) Csharp




How to Do This


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

2. Configure the project properties:

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:

 


More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read