Knowledge base KB0207

Excel se ferme prématurément lors de l’utilisation de compléments basés sur Add-in Express

Problème

Je rencontre des problèmes avec Excel qui se ferme prématurément et je dispose d’un autre complément installé qui utilise Add-in Express

Les compléments basés sur Add-in Express indiquent adxloader.dll dans la boîte de dialogue Options Excel (FichierOptionsCompléments).

Cause

Il existe un bogue connu dans Add-in Express qui peut provoquer le blocage d’Excel lors de l’utilisation de compléments tiers supplémentaires comme think-cell. Vous trouverez un résumé et une explication détaillée du problème ci-dessous.

Nous avons signalé ce problème à Add-in Express. Si vous souhaitez contacter l’assistance Add-in Express pour demander la résolution de ce bogue, vous pouvez utiliser le numéro de suivi de bogue 9291.

Résumé

Après avoir déclassifié une fenêtre, Add-in Express utilise toujours l’adresse de la procédure de fenêtre enregistrée pour envoyer un message, en supposant qu’elle est toujours valable. Si, entre la déclassification et l’utilisation de l’adresse de la procédure de fenêtre enregistrée, une autre déclassification survient, l’adresse de la procédure de fenêtre n’est plus valable et ainsi, une mauvaise procédure de fenêtre est appelée.

Détails

Dans cette reproduction, le problème est causé par la sous-classification d’une fenêtre EXCEL7, dans cette trame HWND=004301e4.

Ouverture de fenêtre

Tout d’abord, think-cell sous-classifie à l’aide de SetWindowSubclass. L’appel de SetWindowLong provient de l’autorité centrale COMCTL32 et change la procédure de fenêtre de EXCEL à 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

Add-in Express sous-classifie ensuite en appelant directement SetWindowLong, ce qui modifie la procédure de fenêtre de COMCTL32 au code Add-in Express JITed C# (pas de nom de module, JITed en mémoire) :

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

Fermeture de fenêtre

Add-in Express a été utilisé en dernier, il est donc le dernier dans la chaîne. Il peut déclassifier proprement en appelant SetWindowLong directement, ce qui change la procédure de fenêtre du code Add-in Express JITed JITed C# à 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 déclassifie ensuite à l’aide de RemoveWindowSubclass. L’appel de SetWindowLong provient de l’autorité centrale COMCTL32 et change la procédure de fenêtre de COMCTL32 à 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

Jusqu’ici tout va bien. Mais attention : COMCTL32 modifie à nouveau la procédure de fenêtre, cette fois-ci de EXCEL.EXE à l’adresse de 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)

Avec think-cell seul, cela n’arrive pas. La question est donc : Pourquoi COMCTL32 fait-il cela ? C’est clairement une erreur que de dépouiller EXCEL.EXE de sa procédure de fenêtre. Voici donc la pile d’appels qui aboutit à ce que COMCTL32 appelle 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

Conclusion

Après avoir déclassifié la fenêtre, Add-in Express utilise l’adresse de la procédure de fenêtre enregistrée pour envoyer un message, en supposant qu’elle est toujours valable. Si, entre la déclassification et l’utilisation de l’adresse de la procédure de fenêtre enregistrée, une autre déclassification survient, l’adresse de la procédure de fenêtre n’est plus valable et ainsi, une mauvaise procédure de fenêtre est appelée.

Contacter l'assistance

Veuillez désactiver temporairement le complément qui utilise Add-in Express, comme expliqué dans l’article KB0091.

  • Si le problème ne survient que lorsque le complément utilisant Add-in Express est activé, contactez le fournisseur de ce complément. En général, cela est plus efficace si vous, en tant que client, soumettez une demande d’assistance auprès du fournisseur.

  • Veuillez contacter notre équipe d’assistance si vous rencontrez toujours des problèmes avec think-cell après avoir désactivé l’autre complément

    Envoyez-nous les fichiers journaux think-cell. Pour cela, ouvrez PowerPoint et allez dans Insertionthink-cellPlus Menu PlusDemande d’assistance. Les fichiers journaux seront automatiquement joints à un nouvel e-mail.

    Si cela ne fonctionne pas, vous pouvez trouver les fichiers journaux comme expliqué ci-dessous :

    • Ouvrez une nouvelle fenêtre de l'Explorateur Windows et saisissez

      %LOCALAPPDATA%\think-cell

      dans le champ d'adresse et appuyez sur Entrée.

    • Si vous souhaitez parcourir ces répertoires mais que vous ne les voyez pas, c'est probablement parce qu'ils sont paramétrés pour être masqués. Vous pouvez modifier ce paramétrage dans Windows Explorer en sélectionnant :

      • Windows Vista et Windows 7 :
        OrganiserDossier et options de rechercheAffichageAfficher les fichiers et dossiers masqués.
      • Windows 8, Windows 8.1 et Windows 10 :
        AffichageAfficher/MasquerÉléments masqués.
    • Envoyez tous les fichiers avec l'extension .log qui se trouvent dans ce dossier à notre équipe d'assistance. Il peut s'agir de l'un ou l'autre des fichiers suivants : POWERPNT_log.log, EXCEL_log.log, TCMAIL_log.log, TCUPDATE_log.log, TCRUNXL_log.log, PPTTC_log.log, setup_think-cell_xxxxx_log.log.