Knowledge Base KB0207

Bei Verwendung von Add-Ins, die auf Add-in Express basieren, stürzt Excel ab

Problem

Excel stürzt ab und auf meinem Computer ist ein anderes Add-In installiert, das Add-in Express verwendet

Bei Add-Ins, die auf Add-in Express basieren, wird im Dialogfeld Excel-Optionen (DateiOptionenAdd-Ins) die Datei „adxloader.dll“ angezeigt.

Ursache

Ein bekannter Fehler in Add-in Express kann dazu führen, dass Excel abstürzt, wenn andere Drittanbieter-Add-Ins – wie think-cell – verwendet werden. Nachfolgend erhalten Sie eine Zusammenfassung und eine ausführliche Erklärung des Problems.

Dieses Problem wurde von uns an Add-in Express gemeldet. Wenn Sie sich für eine Problemlösung an den Support für Add-in Express wenden möchten, können Sie sich auf die Fehlernachverfolgungsnummer 9291 beziehen.

Zusammenfassung

Nachdem Add-in Express die Unterklasse für ein Fenster freigegeben hat, nutzt es die gespeicherte Adresse der Fensterprozedur in der Annahme weiter, dass sie noch aktuell ist, um eine Nachricht zu senden. Wenn zwischen der Freigabe der Unterklasse und der Nutzung ihrer gespeicherten Fensterprozeduradresse eine andere Unterklasse freigegeben wird, ist die Fensterprozeduradresse nicht mehr aktuell, was dann zur Folge hat, dass die falsche Fensterprozedur aufgerufen wird.

Details

In dieser Reproduktion wird das Problem durch Freigabe der Unterklasse für ein EXCEL 7-Fenster verursacht (in diesem Fall HWND=004301e4).

Öffnen eines Fensters

Als Erstes erstellt think-cell mit SetWindowSubclass eine Unterklasse. Der SetWindowLong-Aufruf erfolgt aus der zentralen Instanz COMCTL32 und setzt die Fensterprozedur von EXCEL auf 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

Dann erstellt Add-in Express eine Unterklasse durch direkten Aufruf von SetWindowLong und setzt die Fensterprozedur von COMCTL32 auf einen JIT-C#-Code in Add-in Express (kein Modulname, sondern per direkten JIT in den Arbeitsspeicher):

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

Schließen eines Fensters

Da Add-in Express zuletzt erfolgt ist, steht es in der Kette an der letzten Stelle. Es kann seine Unterklasse über einen direkten Aufruf von SetWindowLong sauber freigeben und die Fensterprozedur von dem JIT-C#-Code in Add-in Express wieder zurück auf COMCTL32 setzen:

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

Dann gibt think-cell seine Unterklasse mit RemoveWindowSubclass frei. Der SetWindowLong-Aufruf erfolgt aus der zentralen Instanz COMCTL32 und setzt die Fensterprozedur von COMCTL32 wieder zurück auf 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

So weit, so gut. Aber ab hier wird es problematisch. COMCTL32 ändert die Fensterprozedur nun erneut, dieses Mal von EXCEL.EXE auf die Adresse von 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)

Mit think-cell allein wäre dies noch kein Problem. Die Frage ist nur: Warum macht COMCTL32 so etwas? Es ist doch ganz eindeutig falsch, die Fensterprozedur von EXCEL.EXE wegzubiegen. So sieht die Aufrufliste aus, die dazu führt, dass COMCTL32 SetWindowLong aufruft:

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

Fazit

Nachdem Add-in Express die Unterklasse für das Fenster freigegeben hat, nutzt es die gespeicherte Adresse der Fensterprozedur in der Annahme weiter, dass sie noch aktuell ist, um eine Nachricht zu senden. Wenn zwischen der Freigabe der Unterklasse und der Nutzung ihrer gespeicherten Fensterprozeduradresse eine andere Unterklasse freigegeben wird, ist die Fensterprozeduradresse nicht mehr aktuell, was dann zur Folge hat, dass die falsche Fensterprozedur aufgerufen wird.

Support kontaktieren

Bitte deaktivieren Sie vorübergehend das Add-In, das von Add-in Express Gebrauch macht, wie im Knowledge Base-Artikel KB0091 erklärt.

  • Sollte das Problem nur dann auftreten, wenn das Add-In, das Add-in Express nutzt, aktiviert ist, wenden Sie sich an den Anbieter dieses Add-Ins. In der Regel erreichen Sie am schnellsten etwas, wenn Sie als Kunde einen Supportfall bei dem Anbieter einreichen.

  • Wenn auch nach dem Deaktivieren des anderen Add-Ins noch Probleme mit think-cell auftreten, wenden Sie sich bitte an unser Supportteam

    Bitte senden Sie uns die think-cell Protokolldateien. Öffnen Sie dazu PowerPoint und navigieren Sie zu Einfügenthink-cellMehrSupport anfordern. Die Protokolldateien werden automatisch an eine neue E-Mail angehängt.

    Sollte dies nicht funktionieren, können Sie die Protokolldateien folgendermaßen ausfindig machen:

    • Öffnen Sie ein neues Windows Explorer-Fenster, geben Sie in der Adresszeile den Text

      %LOCALAPPDATA%\think-cell

      ein, und drücken Sie auf die Eingabetaste.

    • Wenn Sie die Verzeichnisse durchsuchen möchten, sie jedoch nicht sehen können, wurden sie wahrscheinlich als unsichtbar definiert. Sie können diese Einstellung in Windows Explorer ändern, indem Sie folgende Option aktivieren:

      • Windows Vista und Windows 7:
        OrganisierenOrdner- und SuchoptionenAnsichtVersteckte Dateien und Ordner anzeigen.
      • Windows 8, Windows 8.1 und Windows 10:
        ViewEin-/AusblendenAusgeblendete Elemente.
    • Bitte senden Sie alle in diesem Ordner befindlichen Dateien mit der Erweiterung .log an unser Supportteam. Dabei kann es sich um eine beliebige Kombination folgender Dateien handeln: POWERPNT_log.log, EXCEL_log.log, TCMAIL_log.log, TCUPDATE_log.log, TCRUNXL_log.log, PPTTC_log.log, setup_think-cell_xxxxx_log.log.