http://www.codeguru.com/csharp/.net/net_general/comcom/article.php/c16257
Create an ActiveX using a Csharp Usercontrol
Rating: none
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 
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; } set { 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
posted on 2009-07-29 16:12
jannock 阅读(263)
评论(3) 编辑 收藏