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: