Dependency Walker

Häu­fig höre ich Fra­gen wie: “Ich habe auf mei­nem Com­pu­ter vor eini­ger Zeit ein Spiel / Pro­gramm instal­liert — nun funk­tio­niert es nicht mehr”.

Auf Nach­fra­ge erfah­re ich meist, dass in der Zwi­schen­zeit wei­te­re Pro­gram­me instal­liert bzw. deinstal­liert wur­den, so dass ein Wie­der­her­stel­len des Sys­tems mit HIl­fe von Wider­her­stel­lungs­punk­ten ver­sagt. (Wie­der­her­stel­lungs­punkt akti­vie­ren)

Ein erneu­tes Instal­lie­ren des Pro­gram­mes hat auch kei­nen Erfolgt gebracht, dann hilft viel­leicht der Depen­den­cy Wal­ker. Die­ses frei­en Tool wur­de ursprüng­lich mit den Win­dows XP SP2 Sup­port Tools und Micro­soft Visu­al Stu­dio bis Ver­si­on 8.0 ausgeliefert.

Mit Depen­den­cy Wal­ker kann man Biblio­the­ken auf­fin­den, die die zu über­prü­fen­de aus­führ­ba­re Datei (wie bspw. exe, dll, ocx, sys) benutzt und über­prü­fen, ob alle Biblio­the­ken rich­tig instal­liert bzw. über­haupt vor­han­den sind.

Der Depen­den­cy Wal­ker  gibt ein Baum­dia­gramm aller von der aus­führ­ba­ren Datei benö­tig­ten Modu­le aus. Es ist sowohl für 32- als auch 64-Bit Sys­te­me verfügbar.

Es liegt der­zeit in der Ver­si­on 2.2.6000 vom 29.10.2006 vor. Man kann ihn direkt von der Ent­wick­ler­sei­te herunterladen.

Nach dem Ent­pa­cken des Pake­tes kann man sofort wie mit einer Por­ta­blen Anwen­dung (kei­ne Instal­la­ti­on not­wen­dig, könn­te auf einem USB-Stick mit­ge­nom­men wer­den) loslegen.

Ich star­te den Depen­den­cy Wal­ker und benut­ze ihn gleich als Test­ob­jekt, also “depends.exe”. Dazu kli­cke ich auf das Ord­ner­sym­bol dw001.

dw003 Auf dem Screen­shot sieht man sehr deut­lich, dass eine Datei “dwmapi.dll” ver­misst wird. Die Datei­en “shlwapi.dll” und “mpr.dll” erzeu­gen eine War­nung. Also mache ich mich auf die Suche nach der “dwmapi.dll”. Eine Suche auf mei­ner loka­len Plat­te brach­te kei­nen Fund. Eine mög­li­che Anlauf­stel­le wäre Goog­le oder DLL-files.com. Hier soll­te man natür­lich auf­pas­sen, dass man die ver­miss­te Datei mög­lichst aus einer siche­ren Quel­le erhält.

dw004Ich lade die Datei her­un­ter und plat­zie­re sie erst ein­mal im sel­ben Ord­ner in dem sich schon der Depen­den­cy Wal­ker befin­det. Nun restar­te ich den Depen­den­cy Wal­ker und lade ihn als zu über­prü­fen­de Datei, die gefun­de­ne dwmapi.dll scheint ori­gi­nal von Micro­soft zu sein, sie hat die Pro­dukt­ver­si­on 6.0.5384.4 und besitzt den Zeit­stem­pel 08.12.2006 16:36 Uhr. Es kommt die War­nung: “War­ning: At least one modu­le has an unre­sol­ved import due to a miss­ing export func­tion in a delay-load depen­dent modu­le.” nach der Depen­den­cy-Wal­ker-FAQ kann man die­se War­ung ignorieren.

dw005 Viel­leicht nut­zen noch ande­re System-DLL’s die “dwmapi.dll”, also ver­schie­be ich sie an einen alter­na­ti­ven Spei­cher­ort für Sys­tem DLL’s. Dazu muss man wis­sen, dass ordent­lich pro­gram­mier­te Win­dows­pro­gram­me zuerst im Ver­zeich­nis der aus­führ­ba­ren Datei nach DLL’s suche, danach im Sys­te­m32-Ver­zeich­nis von Win­dows. Dort­hin ver­schie­be ich die DLL und schaue was pas­siert. Sie wird nun im System32 Ver­zeich­nis gefun­den, die War­nung ist aber immer noch da.

Wer mit eng­li­schen Feh­ler­mel­dun­gen ein Pro­blem hat, kann sich alter­na­tiv die eng­li­sche Feh­ler­mel­dung mit dem mehr oder weni­ger glück­lich Babel­fi­sh über­set­zen las­sen. “Min­des­tens hat ein Modul einen unge­lös­ten Import wegen einer feh­len­den Export­funk­ti­on in einen spä­ter zu lade­nen Modul”. Der Depen­den­cy Wal­ker fin­det alle, auch schein­ba­re Pro­ble­me, die­ses hier kön­nen wir getrost ignorieren.

Zur Auf­klä­rung: die “dwmapi.dll” war auf älte­ren Sys­te­men vor­han­den wur­de aber durch die Instal­la­ti­on des Inter­net Explo­rers v7 ent­sorgt. Ande­re DLL’s von Micro­soft besit­zen zwar einen Ansprung­punkt für die “dwmapi.dll” kön­nen das Nicht­vor­han­den­sein der Datei aber ent­spre­chend abfangen.

So müs­sen wir nun jede vom Depen­den­cy Wol­ker ver­miss­te DLL aus­fin­dig machen und ggf. im Pro­gramm­ver­zeich­nis able­gen. Soll­te unser Pro­gramm eine schon im System32 Ver­zeich­nis vor­han­de­ne DLL in einer älte­ren Ver­si­on benö­ti­gen und nicht mit der älte­ren Ver­si­on im Pro­gramm­ver­zeich­nis arbei­ten kön­nen, so haben wir meist schlech­te Kar­ten, da neue­re Pro­gram­me die neue­re Ver­si­on der DLL zum Betrieb benötigen.