DLL-Versionswirrwarr

Ich möchte zwei Versionen einer Software benutzen, welche beide eine DLL-Datei gleichen Namens, jedoch in verschiedenen Versionen im Windows-Ordner benötigen. Die alte Software läuft nicht mit der neuen und die neue nicht mit der alten DLL. Die DLL in das jeweilige Programmverzeichnis zu kopieren, kommt leider nicht in Frage, da beide Programmversionen im selben Ordner liegen müssen. Kann man mit Hilfe der im Artikel „Starthilfe für Oldies“ (c’t 12/11, S. 176) beschriebenen Shims womöglich einem Programm eine andere als die im Windows-Ordner vorhandene DLL-Datei unterschieben?

vorlesen Druckansicht
Lesezeit: 2 Min.

Ich möchte zwei Versionen einer Software benutzen, welche beide eine DLL-Datei gleichen Namens, jedoch in verschiedenen Versionen im Windows-Ordner benötigen. Die alte Software läuft nicht mit der neuen und die neue nicht mit der alten DLL. Die DLL in das jeweilige Programmverzeichnis zu kopieren, kommt leider nicht in Frage, da beide Programmversionen im selben Ordner liegen müssen. Kann man mit Hilfe der im Artikel „Starthilfe für Oldies“ (c’t 12/11, S. 176) beschriebenen Shims womöglich einem Programm eine andere als die im Windows-Ordner vorhandene DLL-Datei unterschieben?

Im Prinzip ist dafür das Shim CorrectFilePaths vorgesehen, mit dem Sie – wie im Artikel beschrieben – Ihrem Programm statt einer bestimmten Datei eine andere unterjubeln können. Ausgerechnet zum Laden von DLLs hat dieses Verfahren bei unseren Versuchen aber nicht zuverlässig funktioniert: Für Windows-Programme gibt es verschiedene Arten, eine DLL zu laden, und offenbar erfasst das Application Compatibility Layer nicht alle.

Für Ihren Fall bietet sich aber ein anderer Lösungsweg an: Sie erzeugen für die beiden Versionen der DLL je einen Ordner außerhalb des normalen Suchpfades, zum Beispiel die Verzeichnisse OldLib und NewLib im Installationsordner des Programms. Dann sorgen Sie dafür, dass die beiden Programmversionen den jeweils für sie gedachten Ordner eben doch in ihrem Suchpfad vorfinden. Das erledigen ein paar Änderungen in der Registry: Für jede der beiden Programmversionen müssen Sie in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths einen neuen Unterschlüssel erzeugen und ihm als Name den Namen der .exe-Datei zuweisen, also etwa MyAppV1.exe und MyAppV2.exe. In den (Standard)-Wert gehört jeweils noch mal der Programmname, aber mit vollem Pfad, also zum Beispiel „C:\Program Files\MyApp\MyAppV1.exe“. Zusätzlich erstellen Sie in jedem der beiden Schlüssel noch einen neuen Zeichenfolgen-Wert namens Path und weisen ihm den vollen Pfad des jeweiligen DLL-Ordners zu, etwa „C:\Program Files\MyApp\OldLib“. Zum Ausprobieren genügt es, das Programm neu zu starten. (hos)