将winform usercontrol注册为COM服务器

时间:2009-11-03 13:05:36

标签: .net visual-c++ c++-cli regasm

我正在尝试将winform用户控件注册为COM服务器,因此我的MFC应用程序可以使用它们。 winform控件是用C ++ / CLI编写的,使用非托管本机dll。我想利用.net的极好的Interop服务将这个用户控件注册为COM服务器。

[ProgId("MyAx.MyAxControl")]    
[ClassInterface(ClassInterfaceType::AutoDual)]
[Guid("612EAF58-ADCC-4e87-BC9E-FA208B037414")]
public ref class MyAxControl: public System::Windows::Forms::UserControl

MSDN说我可以用regasm来实现我的目标,所以我继续进行注册

regasm MyAx.dll /tlb:MyAx.tlb

我甚至生成了一个注册表项

regasm MyAx.dll /regfile:MyAx.reg

并将其与我的注册表

合并

此时我曾期望当我选择工具箱的项目时,此控件将显示在我的COM组件中。然而它并没有出现在那里。这是预期的行为吗?如果是,我将如何在我的MFC应用程序中使用此控件,就此而言,使用任何使用Activex控件的语言(比如Java)。

1 个答案:

答案 0 :(得分:1)

您缺少的是告诉系统您的COM对象是一个控件。缺少的信息是注册表中的“已实施类别”条目。要在注册COM期间提供此信息,您需要创建自定义COM(联合国)注册功能。

private const string ControlsCategoryId = "{40FC6ED4-2438-11CF-A3DB-080036F12502}";

[ComRegisterFunction]
internal static void ComRegister(string key)
{
    key = key.Replace("HKEY_CLASSES_ROOT\\", "");
    RegistryKey reg = Registry.ClassesRoot.CreateSubKey(key);
    reg.SetValue("", "Your.ProgId.Here");
    reg = reg.CreateSubKey("Implemented Categories");
    reg.CreateSubKey(ControlsCategoryId);
}

[ComUnregisterFunction]
internal static void ComUnregisterFunction(string key)
{
    key = key.Replace("HKEY_CLASSES_ROOT\\", "");
    RegistryKey reg = Registry.ClassesRoot.OpenSubKey(key, true);
    reg = reg.OpenSubKey("Implemented Categories", true);
    reg.DeleteSubKey(ControlsCategoryId);
}

Com(un)注册例程必须是静态的,返回void,接受单个字符串或Type参数,并具有适当的属性。 MSDN现在声称只接受Type参数,但出于兼容性原因,字符串版本(来自版本1.1)也正在运行。传递给此函数的字符串是注册表项HKCR \ CLSID {YOUR-CLASS_GUID}。

希望有所帮助。