2009-03-02 8 views
2

J'ai une IE BHO (une barre d'outils) écrite en C# /. NET 2.0 en utilisant COM Interop. J'utilise Visual Studio 2005 pour générer un programme d'installation MSI pour ma barre d'outils en utilisant le projet d'installation.Programme d'installation Enregistrement COM

Dans mon assemblée, j'ai COM registre/méthodes désenregistrement utilisant le ComRegisterFunctionAttribute, qui a mis les clés de Registre qui donnent IE quelques informations clés sur ma barre d'outils (comme le nom de la barre d'outils). Dans mon projet d'installation, j'enregistre ma DLL pour COM en utilisant la propriété vsdrpCOMRelativePath (voir le code ci-dessous). Lorsque j'installe avec le MSI, la barre d'outils fonctionne correctement, mais j'ai un problème lancinant: Lorsque je démarre IE et que je sélectionne ma barre d'outils, elle apparaît dans la liste des barres d'outils valides, mais elle a la classe entièrement qualifiée nom: « MyToolbar.IEHelperToolbar » au lieu d'un nom normal: « IEHelperToolbar »

Il semble que le MSI généré par le projet d'installation ne demande pas les méthodes d'enregistrement personnalisées que je l'ai défini dans mon assemblée. Je suis arrivé à cette conclusion parce que si j'utilise regasm.exe pour enregistrer la DLL, IE affiche le nom correct. Dois-je utiliser un paramètre d'enregistrement différent dans mon projet d'installation, ou devrais-je suivre l'approche dans ce post:, ou je devrais juste abandonner le projet d'installation VS2005 et aller à quelque chose comme WIX, ou suis-je loin de la base?

Voici mon registre/fonctions: désenregistrement

/// <summary> 
/// Called when derived class is registered as a COM server. 
/// </summary> 
[ComRegisterFunctionAttribute] 
public static void Register(Type t) 
{ 
    string guid = t.GUID.ToString("B"); 

    RegistryKey rkClass = Registry.ClassesRoot.CreateSubKey(@"CLSID\" + guid); 
    RegistryKey rkCat = rkClass.CreateSubKey("Implemented Categories"); 

    ToolbarAttribute[] boa = (ToolbarAttribute[])t.GetCustomAttributes(
     typeof(ToolbarAttribute), 
     false); 

    string name = t.Name; 
    string help = t.Name; 
    ToolbarStyle style = 0; 
    if (boa.Length == 1) 
    { 
     if (boa[0].Name != null) 
      name = boa[0].Name; 

     if (boa[0].HelpText != null) 
      help = boa[0].HelpText; 

     style = boa[0].Style; 
    } 

    rkClass.SetValue(null, name); 
    rkClass.SetValue("MenuText", name); 
    rkClass.SetValue("HelpText", help); 

    if (0 != (style & ToolbarStyle.Vertical)) 
     rkCat.CreateSubKey("{00021493-0000-0000-C000-000000000046}"); 

    if (0 != (style & ToolbarStyle.Horizontal)) 
     rkCat.CreateSubKey("{00021494-0000-0000-C000-000000000046}"); 

    if (0 != (style & ToolbarStyle.TaskbarToolBar)) 
     rkCat.CreateSubKey("{00021492-0000-0000-C000-000000000046}"); 

    if (0 != (style & ToolbarStyle.ExplorerToolbar)) 
     Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Toolbar").SetValue(guid, name); 

} 

/// <summary> 
/// Called when derived class is unregistered as a COM server. 
/// </summary> 
[ComUnregisterFunctionAttribute] 
public static void Unregister(Type t) 
{ 
    string guid = t.GUID.ToString("B"); 
    ToolbarAttribute[] boa = (ToolbarAttribute[])t.GetCustomAttributes(
     typeof(ToolbarAttribute), 
     false); 

    ToolbarStyle style = 0; 
    if (boa.Length == 1) style = boa[0].Style; 

    if (0 != (style & ToolbarStyle.ExplorerToolbar)) 
     Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Toolbar").DeleteValue(guid, false); 

    Registry.ClassesRoot.CreateSubKey(@"CLSID").DeleteSubKeyTree(guid); 
} 

Répondre

1

Le programme d'installation fourni avec VS2005 est très concassées pour les projets qui nécessitent une inscription COM. J'ai passé environ deux jours à essayer de le faire fonctionner correctement il y a quelques années, puis j'ai découvert le programme d'installation gratuit de NSIS et je n'ai jamais reculé.

Jetez un oeil à:

http://nsis.sourceforge.net/Main_Page