Páginas

quarta-feira, 13 de maio de 2009

Add-in VSTO Excel não carregando em Terminal Service

Há algum tempo trabalhei em um projeto que precisou de uma solução envolvendo add-in VSTO para Excel. Era uma aplicação onde o usuário informava alguns dados na planilha e executava determinada funcionalidade no add-in que enviava esses dados para processamento no servidor.

Esta solução foi implantada há aproximadamente um ano, e funciona ok. Ela costuma ser instalada diretamente nas máquinas dos usuários.

Recentemente nos deparamos com um problema. Essa solução, quando instalada em servidores de terminal service, não funciona. O add-in não aparece para os usuários. Nem mesmo ele aparece nos “Disabled Items”, que é o local onde são exibidos os add-ins que não conseguiram carregar no Excel.



(Excel 2003 – no menu “Help”, clicar em “About Microsoft Office Excel” e depois em “Disabled Items”)

Obs. Há algum tempo, coloquei no blog como verificar erros no carregamento de add-ins (http://galorebr.blogspot.com/2008/03/nas-ltimas-semanas-estive-trabalhando.html).

Ao tentar adicionar o add-in “na unha”, através da janela COM Add-in e selecionando a respectiva dll, aparecia uma mensagem dizendo que meu add-in não era um add-in válido (".dll is not a valid Office add-in".).



Resolvi ir atrás de como o Excel e o VSTO carregam os ad-ins. Encontrei um artigo no site do MSDN, que explica que o Excel busca algumas chaves no registry para fazê-lo (http://msdn.microsoft.com/en-us/library/bb386106.aspx).

Nele, vi que as seguintes chaves precisam existir:
Para o Office 2003:

  • HKEY_CURRENT_USER\Software\Microsoft\Office\application name\Addins\add-in ID
  • HKEY_CURRENT_USER\Software\Classes\add-in ID\CLSID
  • HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}
  • HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}\InprocServer32
  • HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}\ProgID
  • HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}\Programmable
  • HKEY_CURRENT_USER\Software\Classes\CLSID\{add-in CLSID}\VersionIndependentProgID
Para o Office 2007:

  • HKEY_CURRENT_USER\Software\Microsoft\Office\application name\Addins\add-in ID
Mais detalhes estão no artigo, mas o problema que acontecia era que essas chaves não estavam cadastradas para o usuário (cada usuário que loga no servidor possui sei HKEY_CURRENT_USER).

A solução que tivemos foi fazer a importação dessas chaves através de um script que é executado quando o usuário loga no servidor pela primeira vez. Dessa maneira, foi possível com que o add-in aparecesse! Inclusive ela funcionou com o Citrix!

Uma observação: escolhemos essa solução de importar as chaves para cada usuário ao invés de importá-las no HKEY_LOCAL_MACHINE (que é acessível a todos os usuários) por causa do Office 2007, que só enxerga os add-ins que estão no HKCU.

[]’s

UPDATE

Em tempo, abaixo estão os scripts utilizados na importação das chaves. Veja que tanto Reg_XYZ.vbs quanto XYZ.reg devem estar localizados na pasta c:\Reg_XYZ\.
Para fazer com que cada usuário execute o script ao efetuar o login, devemos colocar a linha o call “c:\Reg_XYZ\Reg_XYZ.vbs no arquivo c:\windows\system32\usrlogon.cmd (pode ser logo após o primeiro comando @Echo Off).

A idéia dos scripts é primeiro verificar se existe um arquivo txt. Se já existir, então quer dizer que as chaves já foram importadas. Se não existir, então quer dizer que as chaves devem ser importadas. Logo após a importação, é gerado um txt para marcar que o usuário está ok com as chaves.

Obs. Royalties ao Luiz Alberto Valente, que escreveu esta parte.

Reg_XYZ.vbs

Call verificatxt
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "reg import C:\Reg_XYZ\XYZ.reg"
Call criatxt
'Funcao Verifica se o Script Ja foi executado
Function Verificatxt
Const USER_PROFILE = &H28&
Set objShell = CreateObject("Shell.Application")Set objFolder = objShell.Namespace(USER_PROFILE)Set objFolderItem = objFolder.Self
caminho = objFolderItem.Path & "\XYZ.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(caminho) Then Wscript.quitEnd If End Function
'Funcao cria o log de validacao
Function criatxt
Const USER_PROFILE = &H28&
Set objShell = CreateObject("Shell.Application")Set objFolder = objShell.Namespace(USER_PROFILE)Set objFolderItem = objFolder.Self
caminho = objFolderItem.Path & "\XYZ.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")Set objFile = objFSO.CreateTextFile(caminho)
End Function

XYZ.reg

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\galore.XYZ.ui.XYZExcel2003Addin]"Manifest"="C:\\Program Files\\FABRICANTE\\XYZ\\galore.XYZ.ui.XYZExcel2003Addin.dll.manifest""LoadBehavior"=dword:00000003"Description"="galore XYZ - Addin para Excel 2003""FriendlyName"="galore XYZ - v. Excel 2003""CommandLineSafe"=dword:00000001
[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}]@="galore.XYZ.ui.XYZExcel2003Addin -- an addin created with VSTO technology"
[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}\InprocServer32]"ManifestLocation"="C:\\Program Files\\FABRICANTE\\XYZ\\""ThreadingModel"="Both"@=hex(2):25,00,43,00,6f,00,6d,00,6d,00,6f,00,6e,00,50,00,72,00,6f,00,67,00,72,\ 00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,25,00,5c,00,4d,00,69,00,63,00,\ 72,00,6f,00,73,00,6f,00,66,00,74,00,20,00,53,00,68,00,61,00,72,00,65,00,64,\ 00,5c,00,56,00,53,00,54,00,4f,00,5c,00,38,00,2e,00,30,00,5c,00,41,00,64,00,\ 64,00,69,00,6e,00,4c,00,6f,00,61,00,64,00,65,00,72,00,2e,00,64,00,6c,00,6c,\ 00,00,00"ManifestName"="galore.XYZ.ui.XYZExcel2003Addin.dll.manifest"
[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}\ProgID]@="galore.XYZ.ui.XYZExcel2003Addin"
[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}\Programmable]
[HKEY_CURRENT_USER\Software\Classes\CLSID\{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}\VersionIndependentProgID]@="galore.XYZ.ui.XYZExcel2003Addin"
[HKEY_CURRENT_USER\Software\Classes\galore.XYZ.ui.XYZExcel2003Addin]@=""
[HKEY_CURRENT_USER\Software\Classes\galore.XYZ.ui.XYZExcel2003Addin\CLSID]@="{AD211889-FBA9-4CEB-A92B-9569B9FDAB76}"

Nenhum comentário:

Postar um comentário