Windows ConfidentialFlucht aus der DLL-Hölle

Raymond Chen

DLL-HÖLLE Ein Problem von einer solchen Niedertracht, dass es sogar einen eigenen Spitznamen bekommen hat. Sie installieren ein einziges Programm und plötzlich funktioniert irgendein anderes Programm nicht mehr, das scheinbar nichts mit dem neuen Programm zu tun hat. Das liegt daran, ohne Ihr Wissen sind beide Programme über eine gemeinsam genutzte DLL-Datei miteinander verbunden. Die beiden Programme sind sich vielleicht nicht einig über die Version, die die im Systemverzeichnis gespeicherte MSVCRT.DLL-Datei haben sollte. Oder vom ersten Programm wurde ein gemeinsam genutztes ActiveX®-Steuerelement mit einem Upgrade aktualisiert, zu dem das zweite Programm nicht 100 % kompatibel ist.

Wenn beide Programme von großer Bedeutung für die täglichen Vorgänge in Ihrem Unternehmen sind, ist es ziemlich egal, welches Programm die Schuld trägt. Das Wesentliche ist, Sie müssen beide Programme lauffähig machen. Es gibt da keinen großen Unterschied zwischen "Wir verlieren Geld" und "Wir verlieren Geld wegen Bob". Wie dem auch sei, Ihr Unternehmen verliert Geld und es ist Ihre Aufgabe, dieses Problem unverzüglich zu beseitigen.

Früher war es einmal üblich, dass Sie entscheiden mussten, welches Programm gewonnen und welches Programm verloren hat. Seit Windows® 2000 werden Hilfsmittel zur Verfügung gestellt, die den Benutzer bei der Behebung solcher Konflikte hilfreich unterstützen. Diese Hilfsmittel bieten jedoch nur eine vorübergehende Lösung, um Ihr System schnell wieder betriebsbereit zu machen. Sie gewinnen dadurch Zeit, um nach einer dauerhafteren Lösung des Konflikts zu suchen.

In Windows 2000 ist eine rudimentäre Version vom so genannten "Dynamic-Link Library Redirection" (Umleitung von DLLs) implementiert. Um DLL-Redirection zu ermöglichen, legen Sie eine Datei mit demselben Namen des Programms an, dessen DLLs umgeleitet werden sollen, jedoch mit der Erweiterung .local am Ende des Dateinamens. Beispiel: Um eine Umleitung für C:\Programme\Litware Inc\Invoice.exe einzurichten, erstellen Sie die Datei C:\Programme\Litware Inc\Invoice .exe.local. Der Inhalt dieser Datei ist ohne Bedeutung. Ausschlaggebend ist, dass diese Datei vorhanden ist.

Nachdem Sie die Umleitung für ein Programm eingerichtet haben, wird bei allen Versuchen dieses Programms, eine DLL zu laden, zuerst das Verzeichnis durchsucht, in dem sich das eigentliche Programm befindet. Erst danach werden die üblichen Suchpfade durchsucht. Daher können Sie, im Fall eines Konflikts bei der Datei MSVCRT.DLL, eine Umleitung für alle betroffenen Programme einrichten und jeweils eine gesonderte MSVCRT.DLL in den Installationsverzeichnissen der einzelnen Programme ablegen. So erhält jedes Programm seine eigene Version von MSVCRT.DLL - die DLL-Version, mit der das Programm getestet wurde.

Das Besondere dieser Methode ist, sie funktioniert auch dann, wenn das Programm einen vollständigen Pfad zum Laden der DLL verwendet. Beispiel: Nehmen wir an, das Programm versucht, die DLL C:\Programme\Gemeinsame Dateien\Proseware Inc\taxplugin.dll zu laden. Nach dem Aktualisieren auf Proseware 2.0 bemerken Sie, dass das Plug-In "Steuern" nicht mit Ihrem Programm für die Rechnungslegung kompatibel ist. Sie können nun eine alte Version des Plug-In "Steuern" nach C:\Programme\Litware Inc\taxplugin.dll kopieren. Selbst wenn das Programm einen vollständigen Pfad für das Laden des Plug-In "Steuern" verwendet, sucht die DLL-Umleitung trotzdem zuerst im aktuellen Verzeichnis und verwendet die lokal abgelegte Version anstatt der Version im Verzeichnis "Proseware Inc".

In Windows XP und Windows Vista™ sind die Regeln für die DLL-Umleitung etwas anders, aber das Grundprinzip bleibt das gleiche. Zusätzlich zum Anlegen einer Datei ".local" können Sie auch ein Verzeichnis ".local" anlegen. In diesem Fall wird die DLL im Verzeichnis ".local" anstatt im Installationsverzeichnis des Programms gesucht. Auf diese Weise können Sie die Umleitung konfliktfrei auf mehrere Programme im selben Verzeichnis anwenden.

Beachten Sie, dass Sie die Umleitung nicht für Programme einrichten können, die ein Anwendungsmanifest enthalten, auch die so genannten "bekannten DLLs" sind von der Umleitung ausgeschlossen. (Weitere Informationen finden Sie unter "Dynamic-Link Library Redirection" (in Englisch).)

Die DLL-Umleitung holt Sie zwar nicht ganz aus der DLL-Hölle, sie gibt Ihnen jedoch einige Methoden für die Erstversorgung an die Hand, bis Sie die Ursache des Problems gefunden haben.

Abbildung 1

Abbildung 1   

Raymond Chen schreibt auf seiner Website, The Old New Thing (in Englisch) und auch in seinem neuen Buch mit dem gleichnamigen Titel "The Old New Thing" (Addison-Wesley, 2007, in Englisch) sowohl über die Geschichte von Windows als auch über die Win32-Programmierung. Raymond besitzt allerdings keine Hauskatze mit dem Namen "The Old New Thing".

© 2008 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig.