我正在尝试将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)。
答案 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}。
希望有所帮助。