2009-11-03 5 views
4

Je tente d'enregistrer un contrôle utilisateur winform en tant que serveur COM pour que mes applications MFC puissent les utiliser. Le contrôle winform est écrit en C++/CLI et utilise une DLL native non managée. Je veux utiliser les excellents services Interop de .net pour enregistrer ce contrôle utilisateur en tant que serveur COM.Enregistrement d'un winform usercontrol en tant que serveur COM

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

MSDN dit que je peux utiliser regasm pour obtenir ce que je fais, alors je suis allé de l'avant et l'a enregistré

regasm MyAx.dll /tlb:MyAx.tlb 

J'ai même généré une entrée de registre

regasm MyAx.dll /regfile:MyAx.reg 

et a fusionné avec mon registre

À ce stade, je m'attendais à ce que ce contrôle apparaisse dans mon composant COM s quand je vais choisir les éléments pour la boîte à outils. Cependant, il n'apparaît pas là-bas. Est-ce un comportement attendu? Si oui, comment vais-je utiliser ce contrôle dans mon application MFC, d'ailleurs toute langue qui consomme un contrôle ActiveX (disons Java).

Répondre

1

Ce qui vous manque c'est de dire au système que votre objet COM est un contrôle. L'information manquante est l'entrée "Implemented Categories" dans le registre. Pour fournir cette information lors de l'enregistrement à COM, vous devrez créer une fonction d'enregistrement COM (un) personnalisée.

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); 
} 

routines d'enregistrement Com (un) doivent être statique, retour vide, accepter seule chaîne ou un argument de type, et ont l'attribut approprié. Le MSDN prétend maintenant que seul l'argument Type est accepté, mais pour des raisons de compatibilité, la version de chaîne (à partir de la version 1.1) fonctionne également. La chaîne transmise à cette fonction est la clé de registre HKCR \ CLSID {YOUR-CLASS_GUID}.

Espérons que ça aide.

+0

Je l'avais déjà dans mon code. Bien a pris certains de vos conseils pour l'implémenter comme vous venez de le faire. Mais il n'apparaît pas dans les composants COM lorsque vous essayez de l'ajouter en choisissant des éléments. – rptony

+0

Il semble que bien que vous définissiez le ProgId, le composant COM est répertorié par le nom de type complet (espace de noms complet et nom de fichier) plutôt que par ce ProgId. Il est cependant créable par ce ProgId. J'ai mis à jour le code avec reg.SetValue ("", "Your.ProgId.Here"); et maintenant il devrait s'afficher correctement dans les composants COM (également dans OLE Viewer sous Objets \ Groupped By Category \ Controls) – kossib

Questions connexes