Per alcune settimane abbiamo combattuto con un problema in cui a un piccolo numero di clienti il nostro addin di Outlook viene scaricato e disabilitato per motivi ancora indeterminati. Con il termine "disabile" Voglio dire che Outlook modifica il seguente valore del Registro di 3-2 che in effetti significa che il componente aggiuntivo non verrà caricato all'avvio successivo:Che cosa può causare che Outlook modifichi il LoadBehavior di un componente COM in 2, a parte le eccezioni non gestite?
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook\Addins\[OurAddin.sProgID]\LoadBehavior
Non v'è alcun messaggio di errore e non fare qualsiasi le eccezioni appaiono nei file di log che il nostro addin produce da sé.
Ho già trovato la seguente pagina che tratta specificamente il problema del cambiamento LoadBehavior: http://blogs.msdn.com/vsod/archive/2008/04/22/Troubleshooting-com-add-in-load-failures.aspx
Tuttavia, nessuna delle ragioni possibili proposte ci sembrano essere applicabile:
- Il componente aggiuntivo non è solo elencato nell'elenco delle voci disabilitate.
- Non ci sono eccezioni non gestite né nei metodi
IDTExtensibility2
né altrove nel codice. Tutto il codice è racchiuso tra gli equivalenti try/catch e tutte le eccezioni vengono emesse solo tramiteOutputDebugString
o in un file di registro. - L'errore sembra essere indipendente dal software antivirus, vale a dire che si verifica anche con esso disabilitato.
- Anche la disattivazione di tutti gli altri componenti aggiuntivi non ha alcun effetto sull'errore.
Allora, che altro può causare Outlook per disattivare un componente aggiuntivo?
qualche dettaglio in più/osservazioni:
- Non sono stati in grado di riprodurre il problema nei nostri ambienti di test finora così non siamo ancora stati in grado di collegare un debugger mentre si verifica il problema.
- Il problema non si verifica mai mentre cerchiamo di vedere cosa succede tramite il supporto remoto (TeamViewer). Sospetto che questo sia dovuto al fatto che TeamViewer utilizza una DLL di aggancio che si inietta in tutti i processi in esecuzione (incluso Outlook) e quindi influenza il layout della memoria, i tempi, l'ordine dei thread e così via.
- Ogni volta che compiliamo una nuova versione dell'addin per provare qualcosa di nuovo, l'addin funzionerà normalmente per un paio d'ore o addirittura solo per essere nuovamente disabilitato. Una volta che questo è successo, tutti i successivi tentativi di caricare l'addin su quella macchina (cambiando manualmente il valore di LoadBehavior) falliranno (cioè LoadBehaviour tornerà semplicemente a 2) finché non compileremo e distribuiremo un'altra build (o proveremo a guardare usando TeamViewer - vedi sopra).
- In genere l'addin viene scaricato direttamente all'avvio di Outlook anche se occasionalmente si verifica anche dopo che Outlook è già in esecuzione da qualche tempo. Il file di registro in questi casi sembra completamente inconsapevole: l'addin passa semplicemente attraverso i normali passaggi di spegnimento proprio come se Outlook fosse stato chiuso normalmente.
- Per quanto mi riguarda posso dire dai nostri file di log e osservando la questione tramite SysInternals ProcessMonitor, quando il componente aggiuntivo ottenere disabilitato all'avvio di Outlook (piuttosto che durante la sessione) la DLL viene scaricata anche prima che l'oggetto COM (vale a dire il componente aggiuntivo) viene istanziato (i messaggi di registro nel costruttore non vengono mai visualizzati).
- abbiamo messo
OutputDebugString
messaggi ininitialization
sezioni (questa una DLL Delphi). Nessuno di questi viene visualizzato quando l'addin non viene caricato. Solo una piccola parte dei nostri clienti è interessata da questo problema. Abbiamo diverse decine di migliaia di installazioni dalle quali non abbiamo ricevuto alcuna segnalazione al riguardo.
UPDATE: Sembra che spesso (ma non sempre) una delle ultime cose che viene effettuato l'accesso prima che il componente aggiuntivo viene scaricato è un'eccezione con il testo "l'errore 800A01A8 OLE". Tale eccezione viene catturata da un gestore di eccezioni globale incorporato nel framework che sto utilizzando (Add-in-Express) e non viene originato da qualsiasi parte del mio codice, ogni singolo metodo di cui è ora interamente racchiuso in
try..catch
. Ciò si verifica in genere subito dopo aver impostato la visibilità dei miei CommandBarButtons da un gestore di eventi Activate di Inspector.
proprietà comuni di tutti i computer interessati:
- Windows XP Professional, up-to-date livello di patch
- Outlook 2003 Professional, up-to-date livello di patch
- versioni diverse di McAfee Virus Scan (sebbene disabilitarlo non ha alcun effetto - vedi sopra)
- Gli utenti sono membri del gruppo Administrators locale
Un'altra cosa da notare che molto probabilmente è significativa (anche se forse non tanto quanto ho pensato prima):
Stiamo usando un modulo di protezione delle licenze/copia da un fornitore di terze parti che avvolge la DLL compilata in una "shell" e lo decomprime solo al volo. Da quando ho scoperto che l'addin viene scaricato anche prima che il nostro codice venga eseguito, questo è stato il mio principale sospetto. Tuttavia, mentre il venditore ha confermato che potrebbero esserci eccezioni non gestite nel proprio codice, un file di registro prodotto da una versione di debug speciale della shell di protezione ha mostrato che il processo di decompressione è stato completato correttamente e il controllo è stato già restituito alla DLL protetta prima che Outlook scaricasse l'addin . Quindi sembra che qualunque cosa induca Outlook a scaricare il nostro addin avviene tra il completamento dell'inizializzazione della shell di protezione e il nostro codice.
Altre idee?
No, non sembra essere niente del genere. Inoltre, la semplice modifica del valore di LoadBehavior per la maggior parte del tempo non aiuta - verrà semplicemente reimpostata su 2 alla successiva accensione di Outlook. –
Stavi davvero parlando della voce LoadBehavior, però? Per quanto ne so, i passaggi che descriveresti porterebbero piuttosto a una voce sotto il tasto Resiliency (noto anche come "Elementi disattivati"), non è vero? Quest'ultimo non si applica nel mio caso. –