2015-11-13 5 views
0

J'ai un service Windows qui est censé installer les polices. J'ai un dossier contenant les polices, et j'utiliser ce code pour les installer:Windows Service: Installer les polices

[DllImport("gdi32.dll", EntryPoint = "AddFontResourceW", SetLastError = true)] 
    public static extern int AddFontResource([In][MarshalAs(UnmanagedType.LPWStr)] 
            string lpFileName); 


var fontDestination = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), fontName); 

     if (File.Exists(fontDestination)) 
     { 
      return; 
     } 

     logger.Info(String.Format("Installing font: {0}", fontName)); 

     try 
     { 
      File.Copy(fontFullPath, fontDestination); 

      // Retrieves font name 
      var fontCollection = new PrivateFontCollection(); 
      fontCollection.AddFontFile(fontDestination); 
      var actualFontName = fontCollection.Families[0].Name; 

      //Add font 
      AddFontResource(fontDestination); 
      var error = Marshal.GetLastWin32Error(); 
      if (error == 0) 
      { 
       //Add registry entry 
       logger.Info(String.Format("Font {0} installed successfully", fontName)); 
       Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", 
        actualFontName, fontName, RegistryValueKind.String); 
      } 

La police sera copié dans les fontDestination (Environment.GetFolderPath (Environment.SpecialFolder.Fonts)) puis la AddFontResource volonté ajoutez-le à la session.

Tout fonctionne comme prévu si j'exécute le service en tant qu'application console ou en mode débogage. Les polices deviennent disponibles dans le bloc-notes, le mot, etc. sans redémarrer la machine. Si je l'installe et l'exécute en tant que service, le journal confirme que la police est correctement installée, le registre est ajouté, le fichier se trouve dans le dossier Windows/fonts, mais n'est pas disponible dans les applications qui l'utilisent. Si je redémarre mon ordinateur, je soupçonne que Windows regarde dans le registre, voit le fichier dans le dossier Windows/fonts et le rend disponible pour les applications à utiliser. EDIT: Il est en fait disponible après un redémarrage.

J'ai besoin d'exécuter ce service sur une machine virtuelle qui ne redémarrera pas, donc j'ai besoin de police pour être disponible juste après l'installation. Je suppose que cela a quelque chose à voir avec les droits des utilisateurs pour les services. Je spécifie que le service est connecté en tant que LocalSystem.

+0

quelle partie de ce « je suspecte » est soupçonné, et quelle partie de ce qui se passe réellement? La façon dont il est actuellement formulé suggère que toutes les parties sont des spéculations, donc: * * sont les polices disponibles après un redémarrage? –

+0

Oui, ils sont disponibles après un redémarrage, s'ils sont installés à partir du service Windows. Si je cours le code que j'ai posté dans une application de console (ou exécute le service comme application de console) alors ils sont disponibles sans redémarrer. –

+0

sont tous deux exécutés en tant qu'administrateur? (c'est-à-dire le service installé à l'aide des informations d'identification de l'administrateur et la console s'exécute en tant qu'administrateur?) –

Répondre

0

Essayez de désactiver ou redémarrer le service Windows pour le cache des polices