Probleme mit TreeView, ListView und Co. beheben

Am 14. August 2012 war es mal wieder soweit: Microsoft hat eine änderung an den ActiveX-Steuerelementen der Bibliothek MSCOMCTL.ocx vorgenommen, welche die meisten in Betrieb befindlichen TreeView- und ListView-Steuerelemente untauglich machte und zahlreichen Entwicklern tagelange Fehlersuche bescherte. Wir zeigen, wie die Probleme entstehen und wie Sie diese beheben können.

Die Bibliothek MSCOMCTL.ocx enthält ActiveX-Steuerelemente wie das TreeView-Steuerelement oder das ListView-Steuerelement. Mit einem Sicherheitsupdate hat Microsoft im August 2012 eine neue Version dieser Bibliothek geliefert, die allerdings je nach Office-Version nicht richtig registriert wurde.

Dies resultiert in verschiedenen Problemen, zum Beispiel:

  • Fehler 2683, In diesem Steuerelement befindet sich kein Objekt.
  • Benutzerdefinierte Ereignisprozeduren werden nicht mehr ausgeführt.
  • Oder es erscheint die Meldung aus Bild 1, sobald Sie mit der Maus etwa ein ListView-Steuerelement überfahren.
  • pic002.png

    Bild 1: Fehler beim Einsatz einer mit der neuen Version kompilierten Datenbank mit der alten Version der Datei MSCOMCTL.ocx

  • In einigen Fällen wir auch einfach der Verweis auf die Bibliothek MSCOMCTL.ocx im Verweise-Dialog als NICHT VORHANDEN gekennzeichnet – was wiederum zu Folgefehlern führt, die gar nicht mit dem ursprünglichen Problem zu tun haben. So erkennt Access beispielsweise einfache VBA-Befehle nicht mehr.

Diese Probleme entstehen dadurch, dass die neue MSCOMCTL.ocx nicht ordnungsgemäß registriert beziehungsweise die alte nicht richtig aus der Registrierung entfernt wurde.

Dies äußert sich in einigen Fällen darin, dass die Registry unter dem Zweig HKEY_CLASSES_ROOT\TypeLib\{831FDD16-0C5C-11D2-A9FC-0000F8754DA1} nun zwei Elemente namens 2.0 und 2.1 enthält (s. Bild 2). In manchen Fällen war nach der Installation auch nur ein Eintrag vorhanden, nämlich 2.0.

pic001.png

Bild 2: Mögliche Registry-Konstellation nach Installation des Sicherheitsupdates

Mitunter scheint das Sicherheitsupdate und somit die neue Version gar nicht für die Probleme verantwortlich zu sein. Auf einer virtuellen Maschine erhielt ich beispielsweise die oben genannte Meldung, obwohl dort nachweislich die Version 6.1.98.33 installiert war – die neue Version heißt 6.1.98.34. Möglicherweise resultieren solche Probleme daraus, dass Sie eine Anwendung auf einem Rechner mit der neuen Version der MSCOMCTL.ocx kompilieren, diese auf dem Zielsystem aber nicht vorhanden ist.

In diesem Fall reichte es, einfach nur die neueste Version der MSCOMCTL.ocx über die vorhandene Version zu kopieren beziehungsweise die vorhandene Version umzubenennen und die neue in das Verzeichnis der Systemdateien zu kopieren!

Wir haben es also eigentlich mit zwei verschiedenen Problemen zu tun:

  • Variante I: die Version 6.1.98.34 der Datei MSCOMCTL.ocx wird installiert, aber nicht richtig registriert beziehungsweise die Vorgängerversion nicht korrekt entfernt oder
  • Variante II: ein mit der neuen Version kompiliertes Projekt landet auf einem System, das noch nicht mit der neuen Version ausgestattet ist und verursacht Probleme.

Lösung des Problems, Variante I

Für meine Anwendungen, die ich bei Kunden und bei mir einsetze, habe ich nun folgende Lösung gefunden, die bisher in allen Fällen geholfen hat:

  • Wenn ein Zweig namens 2.0 vorhanden ist, muss dieser entfernt werden.
  • Der Zweig 2.1 muss nochmals erneuert werden.

Dies können Sie auf verschiedene Arten erreichen. Eine einfache Methode ist es, einfach die Registry zu öffnen, das Element mit dem Namen 2.0 samt Unterelementen zu entfernen und durch Registrieren der neuen Version der Datei MSCOMCTL.ocx den Zweig 2.1 neu hinzuzufügen (dies ist nötig, falls dieser noch nicht vorhanden ist).

Nun ist es für einen Entwickler einfach, dies auf dem eigenen Rechner auszuführen. Und per Fernwartung lassen sich die notwendigen Schritte auch schnell auf einem Kundenrechner ausführen. Aber was tun, wenn die Anwendung auf hunderten Kundenrechnern läuft Sie können sich wohl kaum auf all diesen Rechnern einloggen und den Fehler beheben. Und dummerweise gibt es auch noch keine Skript-Lösung, die sich nicht ohne Administrator-Rechte durchführen lässt.

Also wollen wir es dem Benutzer zumindest möglichst einfach machen – ohne manuelle Eingriffe in die Registry.

Sie benötigen dazu zunächst eine ältere Version der MSCOMCTL.ocx, um die Registrierungseinträge für die alte Version auf einfache Weise zu entsorgen. Sie finden die Version 6.1.98.33 im Download zu diesem Beitrag.

Diese kopieren Sie in das Verzeichnis der Systemdateien, je nach Windows-Version eines der folgenden (gegebenenfalls sichern Sie die aktuelle Version der MSCOMCTL.ocx):

  • 32-bit: c:\Windows\System32
  • 64-bit: c:\Windows\SysWow64

Danach öffnen Sie die Eingabeaufforderung mit Administrator-Rechten. Dies erledigen Sie, indem Sie mit der rechten Maustaste auf den entsprechenden Eintrag im Startmenü klicken und dort den Eintrag Als Administrator ausführen … betätigen (s. Bild 3). In der Eingabeaufforderung registrieren Sie dies alte Version der MSCOMCTL.ocx und entfernen anschließend die Registrierung wieder. Für Windows in der 64-bit-Version geht dies mit den folgenden beiden Befehlen:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar