Knowledge base KB0207

O Excel falha ao usar suplementos com base no Add-in Express

Problema

Experienciei uma falha do Excel e instalei outro suplemento, o qual utiliza Add-in Express

Suplementos com base no Add-in Express exibem o adxloader.dll no diálogo de Opções de Excel (ArquivoOpçõesSuplementos).

Motivo

Um bug conhecido no Add-in Express pode causar a falha do Excel quando se utiliza suplementos adicionais de terceiros, como think-cell. Você encontrará abaixo um resumo e uma explicação detalhada do problema.

Nós relatamos este problema para o Add-in Express. Se quiser entrar em contato com o Suporte do Add-in Express e pedir uma correção, você deve fazer referência ao número de rastreamento do bug #9291.

Resumo

Depois que o Add-in Express desfaz a subclasse de uma janela, ainda usa o endereço de procedimento de janela armazenado para enviar uma mensagem, supondo que ainda seja atual. Se entre esse momento e o uso de um endereço de procedimento de janela armazenado, outra subclasse é desfeita, o endereço de procedimento da janela não é mais atual e, portanto, o procedimento de janela errado é chamado.

Detalhes

Nesta reprodução, o problema é causado pela subclasse de uma janela EXCEL7, neste sinal HWND=004301e4.

Abertura da janela

Primeiro, o think-cell realiza a subclasse com SetWindowSubclass. A chamada SetWindowLong sai da autoridade central COMCTL32, alterando o procedimento de janela do EXCEL para 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

Em seguida, o Add-in Express realiza a subclasse ao chamar diretamente o SetWindowLong, alterando o procedimento de janela de COMCTL32 para código JITed C# do Add-in Express (sem nome do módulo, JITed na memória):

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

Fechamento da janela

Add-in Express veio por último, portanto é o último na cadeia. Ele pode desfazer a subclasse simplesmente ao chamar diretamente SetWindowLong, alterando o procedimento de janela do código JITed C# do Add-in Express de volta para 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

Então, o think-cell realiza a subclasse com RemoveWindowSubclass. A chamada SetWindowLong sai da autoridade central COMCTL32, alterando o procedimento de janela de COMCTL32 para 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

Até então, tudo bem. Mas aqui vem: COMCTL32 altera novamente o procedimento de janela, desta vez de EXCEL.EXE para o endereço da 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)

Com o think-cell sozinho, isso não acontece. A pergunta é: Por que o COMCTL32 faz isso? É evidente que está errado retirar o procedimento de janela do EXCEL.EXE. Então, aqui está a pilha de chamadas que leva COMCTL32 a chamar 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

Conclusão

Depois que o Add-in Express desfaz a subclasse da janela, ele usa o endereço de procedimento de janela armazenado para enviar uma mensagem, supondo que ainda seja atual. Se entre esse momento e o uso de um endereço de procedimento de janela armazenado, outra subclasse é desfeita, o endereço de procedimento da janela não é mais atual e, portanto, o procedimento de janela errado é chamado.

Entre em contato com o suporte

Desative temporariamente o suplemento que utiliza Add-in Express, conforme explicado em KB0091.

  • Se o problema só ocorre quando o suplemento que usa o Add-in Express é ativado, entre em contato com o fornecedor deste suplemento. Geralmente é mais eficaz se você, como cliente, abrir um chamado de suporte junto ao fornecedor.

  • Entre em contato com nossa equipe de suporte se você ainda estiver enfrentando problemas com o think-cell depois de desativar o outro suplemento

    Envie-nos os arquivos de registro do think-cell. Para isso, abra o PowerPoint e vá para Inserirthink-cellMaisSolicitar suporte. Os arquivos de log serão anexados automaticamente a um novo e-mail.

    Se essa ação não funcionar, você poderá encontrar os arquivos de registro como explicado abaixo:

    • Abra uma nova janela do Windows Explorer e digite

      %LOCALAPPDATA%\think-cell

      no campo de endereço e pressione Enter.

    • Se você desejar navegar para esses diretórios, mas não conseguir visualizá-los, eles provavelmente estarão definidos como invisíveis. Você pode alterar essa definição no Windows Explorer, marcando:

      • Windows Vista e Windows 7:
        OpçõesOrganizarPasta e pesquisarExibirMostrar arquivos e pastas ocultas.
      • Windows 8, Windows 8.1 e Windows 10:
        ExibirMostrar/ocultarItens ocultos.
    • Envie todos os arquivos com a extensão .log contidos nessa pasta para nossa equipe de suporte. Pode ser um dos seguintes arquivos: POWERPNT_log.log, EXCEL_log.log, TCMAIL_log.log, TCUPDATE_log.log, TCRUNXL_log.log, PPTTC_log.log, setup_think-cell_xxxxx_log.log.