Knowledge base KB0207

Excel si arresta in modo anomalo quando si utilizza un componente aggiuntivo basato su Add-in Express

Problema

Si verificano arresti anomali di Excel ed è stato installato un componente aggiuntivo diverso che utilizza Add-in Express

Per i componenti aggiuntivi basati su Add-in Express viene visualizzato adxloader.dll nella finestra di dialogo Opzioni di Excel (FileOpzioniComponenti aggiuntivi).

Causa

Un bug conosciuto in Add-in Express potrebbe causare l'arresto anomalo di Excel quando si utilizzano componenti aggiuntivi di terze parti come think-cell. Fare riferimento alle informazioni seguenti per un riepilogo e una spiegazione dettagliata del problema.

Abbiamo segnalato questo problema ad Add-in Express. Per contattare il servizio di assistenza di Add-in Express e richiedere una soluzione, è possibile fare riferimento al numero di tracciabilità del bug 9291.

Riepilogo

Dopo aver annullato la sottoclasse di una finestra, Add-in Express utilizza ancora l'indirizzo memorizzato per la procedura della finestra per inviare un messaggio presupponendo che sia ancora quello in uso. Se tra l'operazione di annullamento della sottoclasse e l'utilizzo dell'indirizzo memorizzato per la procedura della finestra viene eseguito un altro annullamento della sottoclasse, l'indirizzo della procedura della finestra non sarà più attuale e verrà quindi richiamata la procedura della finestra errata.

Dettagli

In questa riproduzione, il problema viene causato dall'esecuzione della sottoclasse su una finestra di EXCEL7, in questa traccia HWND=004301e4.

Apertura della finestra

think-cell esegue innanzitutto la sottoclasse con SetWindowSubclass. La chiamata SetWindowLong proviene dall'autorità centrale COMCTL32 e modifica la procedura della finestra da EXCEL a COMCTL32:

TRACE 2016-08-04T09:36:21Z thread 9052 tcaddin\detour\win\safesubclassimpl.cpp(215): 
Module C:\WINDOWS\WINSXS\X86_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.7601.18837_NONE_41E855142BD5705D\COMCTL32.DLL 6.10.7601.18837+0x1410A 
is subclassing window HWND 004301E4 Caption "Book2" Class EXCEL7 WndProc 
C:\PROGRAM FILES (X86)\MICROSOFT OFFICE\OFFICE15\EXCEL.EXE 15.0.4841.1000+0x21A55 Style 0x570B0000 ExStyle 0x00000000 
to C:\WINDOWS\WINSXS\X86_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.7601.18837_NONE_41E855142BD5705D\COMCTL32.DLL 6.10.7601.18837+0x2F45C

A questo punto Add-in Express esegue la sottoclasse chiamando direttamente SetWindowLong, modificando la procedura della finestra da COMCTL32 al codice Add-in Express JITed C# (nessun nome di modulo, JITed in memoria):

TRACE 2016-08-04T09:36:21Z thread 9052 tcaddin\detour\win\safesubclassimpl.cpp(215): 
Module 0x06B7FB84 is subclassing window HWND 004301E4 Caption "Book2" Class EXCEL7 
WndProc C:\WINDOWS\WINSXS\X86_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.7601.18837_NONE_41E855142BD5705D\COMCTL32.DLL 6.10.7601.18837+0x2F45C Style 0x570B0000 ExStyle 0x00000000 to 0x1D47BD7E

Chiusura della finestra

Add-in Express è l'ultimo programma ed essere stato registrato ed è quindi l'ultimo della serie. Può eseguire correttamente l'annullamento della sottoclasse chiamando direttamente SetWindowLong, modificando la procedura della finestra dal codice Add-in Express JITed C# a COMCTL32:

TRACE 2016-08-04T09:36:27Z thread 9052 tcaddin\detour\win\safesubclassimpl.cpp(215): 
Module 0x090CD19C is subclassing window HWND 004301E4 Caption "Book2" Class EXCEL7 
WndProc 0x1D47BD7E Style 0x470B0000 ExStyle 0x00000000 to 
C:\WINDOWS\WINSXS\X86_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.7601.18837_NONE_41E855142BD5705D\COMCTL32.DLL 6.10.7601.18837+0x2F45C

think-cell annulla quindi la sottoclasse con RemoveWindowSubclass. La chiamata SetWindowLong proviene dall'autorità centrale COMCTL32 e modifica la procedura della finestra da COMCTL32 a EXCEL:

TRACE 2016-08-04T09:36:37Z thread 9052 tcaddin\detour\win\safesubclassimpl.cpp(215): 
Module C:\WINDOWS\WINSXS\X86_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.7601.18837_NONE_41E855142BD5705D\COMCTL32.DLL 6.10.7601.18837+0x1438F 
is subclassing window HWND 004301E4 Caption "Book2" Class EXCEL7 WndProc 
C:\WINDOWS\WINSXS\X86_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.7601.18837_NONE_41E855142BD5705D\COMCTL32.DLL 6.10.7601.18837+0x2F45C Style 0x470B0000 ExStyle 0x00000000 
to C:\PROGRAM FILES (X86)\MICROSOFT OFFICE\OFFICE15\EXCEL.EXE 15.0.4841.1000+0x21A55

L'operazione sarebbe quindi corretta, tuttavia a questo punto: COMCTL32 modifica di nuovo la procedura della finestra, questa volta da EXCEL.EXE all'indirizzo di DefWindowProc:

TRACE 2016-08-04T09:36:41Z thread 9052 tcaddin\detour\win\safesubclassimpl.cpp(215): 
Module C:\WINDOWS\WINSXS\X86_MICROSOFT.WINDOWS.COMMON-CONTROLS_6595B64144CCF1DF_6.0.7601.18837_NONE_41E855142BD5705D\COMCTL32.DLL 6.10.7601.18837+0xDEC4C 
is subclassing window HWND 004301E4 Caption "Book2" Class EXCEL7 WndProc 
C:\PROGRAM FILES (X86)\MICROSOFT OFFICE\OFFICE15\EXCEL.EXE 15.0.4841.1000+0x21A55 Style 0x470B0000 ExStyle 0x00000000 
to C:\WINDOWS\SYSWOW64\NTDLL.DLL 6.1.7601.23455+0x22FBD (=DefWindowProc)

Se si utilizzasse esclusivamente think-cell, ciò non avverrebbe. La domanda è: perché COMCTL32 si comporta in questo modo? È chiaramente errato rimuovere la procedura della finestra da EXCEL.EXE. Quindi ecco lo stack di chiamata che induce COMCTL32 a chiamare SetWindowLong:

tcaddin.dll!SetWindowLongPtrW (HWND__ * __formal, int __formal, long __formal) 
with hWnd=004301e4, which is our EXCEL7 window, and dwNewLong= 77102FBD=DefWindowProc
comctl32.dll!_SubclassDeath@16 () Unknown
COMCTL32 realizes that it gets called for a window that it is no longer associated 
with. It must think this is happening from a subclassing chain and reacts in panic by SetWindowLong(DefWindowProc) to ensure this never happens again.

comctl32.dll!_MasterSubclassProc@16 () Unknown
user32.dll!_InternalCallWinProc@20 () Unknown
user32.dll!_UserCallWinProcCheckWow@32 () Unknown
user32.dll!_CallWindowProcAorW@24 () Unknown

user32.dll!_CallWindowProcW@20 () Unknown
Someone (presumably Add-in Express) calls CallWindowProc with lpPrevWndFunc=6e32f45c, which is COMCTL::MasterSubclassProc hWnd=004301e4, which is our EXCEL7 window, Msg=00000002=WM_DESTROY, wParam=00000000, lParam=00000000
This is clearly wrong, COMCTL32 is no longer associated with our EXCEL7 window.

090c6dba() Unknown
[Frames below may be incorrect and/or missing]
090c1cce() Unknown
06b7fe7c() Unknown

081dd1ce() Unknown
code with no module is entered here from the CLR, probably JIT'ed code of 
Add-in Express

clr.dll!UM2MThunk_Wrapper(void *) Unknown
clr.dll!Thread::DoADCallBack(struct ADID,void (*)(void *),void *,int) Unknown
clr.dll!_UM2MDoADCallBack@16 () Unknown
081dd227() Unknown
user32.dll!_InternalCallWinProc@20 () Unknown
user32.dll!_UserCallWinProcCheckWow@32 () Unknown
user32.dll!_DispatchClientMessage@24 () Unknown
user32.dll!___fnDWORD@4 () Unknown
ntdll.dll!_KiUserCallbackDispatcher@12 () Unknown
user32.dll!_NtUserDestroyWindow@4 () Unknown

Conclusione

Dopo aver annullato la sottoclasse della finestra, Add-in Express utilizza ancora l'indirizzo memorizzato per la procedura della finestra per inviare un messaggio presupponendo che sia ancora quello in uso. Se tra l'operazione di annullamento della sottoclasse e l'utilizzo dell'indirizzo memorizzato per la procedura della finestra viene eseguito un altro annullamento della sottoclasse, l'indirizzo della procedura della finestra non sarà più attuale e verrà quindi richiamata la procedura della finestra errata.

Contattare l'assistenza

Disattivare temporaneamente il componente aggiuntivo che utilizza Add-in Express, come spiegato in KB0091.

  • Se il problema si verifica solo quando è attivato il componente aggiuntivo che utilizza Add-in Express, contattare il fornitore del componente aggiuntivo. In generale, si consiglia al cliente di aprire una richiesta di assistenza presso il fornitore.

  • Contattare il nostro team di assistenza se si riscontrano ancora problemi con think-cell dopo aver disattivato l'altro componente aggiuntivo

    Si prega di inviarci i file di log di think-cell. Per questa operazione, aprire PowerPoint, quindi selezionare Inseriscithink-cellAltroRichiedi assistenza. I file di log saranno allegati automaticamente in una nuova e-mail.

    Se non funziona, cercare i file di log seguendo le istruzioni riportate di seguito:

    • Aprire una nuova finestra di Windows Explorer e digitare

      %LOCALAPPDATA%\think-cell

      nel campo dell'indirizzo, quindi premere Invio.

    • Se si sta navigando per cercare queste cartelle ma non si riesce a visualizzarle, probabilmente sono impostate come invisibili. È possibile modificare questa impostazione in Windows Explorer selezionando:

      • Windows Vista e Windows 7:
        OrganizzaOpzioni cartella e ricercaVisualizzaMostra file e cartelle nascoste.
      • Windows 8, Windows 8.1 e Windows 10:
        VisualizzaMostra/NascondiOggetti nascosti.
    • Inviare tutti i file con estensione .log contenuti in questa cartella al nostro team di assistenza. Potrebbe essere uno dei seguenti file: POWERPNT[_log].log, EXCEL[_log].log, TCMAIL[_log].log, TCUPDATE[_log].log, setup_think-cell_xxxxx[_log].log.