Windows ConfidentialSortir de l'enfer des DLL

Raymond Chen

L'ENFER DES DLL. Un problème si insidieux qu'il possède son propre surnom péjoratif ! Vous installez un programme et constatez ensuite qu'un programme apparemment sans lien avec le premier cesse de fonctionner. La raison en est simple. Sans que vous le sachiez, ces deux programmes sont connectés via une DLL partagée. Les deux programmes peuvent avoir un avis différent sur la version du fichier MSVCRT.DLL qui doit se trouver dans le répertoire système. Autre explication possible : le premier programme met à niveau un contrôle ActiveX® que le deuxième programme utilise, mise à niveau avec laquelle le deuxième programme n'est pas entièrement compatible.

Si les deux programmes sont essentiels aux opérations quotidiennes de votre entreprise, le problème n'est pas de savoir quel programme est en tort. La seule chose qui compte est de pouvoir les utiliser tous les deux. Il n'y a pas beaucoup de différence entre « Nous perdons de l'argent » et « Nous perdons de l'argent à cause de Jacques ». Dans les deux cas, votre société perd de l'argent et il vous revient de régler le problème au plus vite.

Il y a peu, la solution consistait à décider quel programme l'emportait sur l'autre. Depuis Windows® 2000, des correctifs logiciels sont proposés pour résoudre ces conflits. Toutefois, ces correctifs n'offrent que des remèdes temporaires permettant de remettre votre système en état de marche, le temps de trouver une solution plus définitive au conflit.

Windows 2000 a implémenté une version rudimentaire de ce qu'on appelle aujourd'hui la Redirection de bibliothèque de liens dynamiques. Pour activer la redirection de DLL, créez un fichier du même nom que le programme dont vous souhaitez rediriger les DLL, mais en ajoutant le suffixe .local à son nom. Par exemple, pour appliquer la redirection à C:\Program Files\Litware Inc\Invoice.exe, créez le fichier C:\Program Files\Litware Inc\Invoice.exe.local. Le contenu du fichier est sans importance. Ce qui importe, c'est que le fichier existe.

Une fois la redirection activée pour un programme, chaque fois que celui-ci essaie de charger une DLL, il commence par regarder dans son répertoire d'installation, avant les emplacements de recherche habituels. Par conséquent, dans le cas du fichier MSVCRT.DLL en conflit, vous pouvez activer la redirection pour chaque programme et mettre une copie privée de MSVCRT.DLL dans le répertoire d'installation de chaque programme. Chaque programme reçoit ensuite sa propre version de MSVCRT.DLL, c'est à dire la version de la DLL avec laquelle le programme a été testé.

La magie de cette technique est qu'elle fonctionne même si le programme utilise un chemin d'accès complet pour charger la DLL. Supposons par exemple, que le programme essaie de charger C:\Program Files\Common Files\Proseware Inc\taxplugin.dll. Après avoir mis à niveau le programme vers Proseware 2.0, vous découvrez que son plug-in d'imposition est incompatible avec votre programme de facture. Vous pouvez alors copier une version ancienne du plug-in d'imposition dans C:\Program Files\Litware Inc\taxplugin.dll. Même si le programme utilise un chemin complet pour charger le plug-in, la redirection de DLL continuera à chercher dans le répertoire actuel et utilisera le fichier local plutôt que celui du répertoire Proseware Inc.

Dans Windows XP et Windows Vista™, les règles de redirection de DLL sont légèrement différentes, mais fonctionnent sur le même principe. En plus de créer un fichier .local, vous pouvez également créer un répertoire .local. Dans ce cas, le système effectue sa recherche dans le répertoire .local plutôt que dans le répertoire d'installation du programme. Cela vous permet d'appliquer la redirection à plusieurs programmes dans le même répertoire, sans engendrer de conflit.

Notez que vous ne pouvez pas appliquer la redirection à des programmes qui contiennent un manifeste d'application, et que les DLL dites connues sont également exemptes de redirection. (Pour plus d'informations, consultez l'article « Redirection de bibliothèque de liens dynamiques ».)

La redirection de DLL ne vous sort pas totalement de l'enfer des DLL, mais vous prodigue au moins les premiers secours, le temps de vous remettre d'aplomb pour résoudre le problème.

Figure 1

Figure 1   

Raymond Chenécrit tant sur l'histoire de Windows que sur la programmation Win32 sur son site Web (The Old New Thing), ainsi que dans son nouveau livre, également intitulé The Old New Thing (Addison-Wesley, 2007). Il n'a pas, en revanche, de chat prénommé The Old New Thing.

© 2008 Microsoft Corporation et CMP Media, LLC. Tous droits réservés. Toute reproduction, totale ou partielle, est interdite sans autorisation préalable.