Windows ConfidentialFuga dall'inferno delle DLL

Raymond Chen

L'inferno delle DLL. Un problema così insidioso da meritarsi un peggiorativo specifico. Un giorno, dopo aver installato un programma, improvvisamente un secondo programma, che apparentemente non ha nulla a che fare con il primo, smette di funzionare. Questo succede perché, all'insaputa dell'utente, i due programmi sono collegati da un file DLL condiviso. I due programmi potrebbero avere idee diverse sulla versione del file MSVCRT.DLL che dovrebbe esserci nella cartella di sistema. Oppure il primo programma può aver aggiornato un controllo ActiveX® che viene usato anche dal secondo programma. Un aggiornamento con cui il secondo programma non è completamente compatibile.

Se tutti e due i programmi sono indispensabili per l'attività quotidiana di un'azienda, non importa poi molto sapere di quale dei due è la colpa. L'importante è che devono funzionare entrambi. Non c'è molta differenza tra dire "Stiamo perdendo soldi" e "Stiamo perdendo soldi per colpa di Marco". Si stanno comunque perdendo dei soldi ed è necessario risolvere il problema prima possibile.

In passato, l'unica soluzione era scegliere il programma da sopprimere. A partire da Windows® 2000, però, è possibile mettere in qualche modo delle pezze a situazioni di questo tipo. In questo modo, il sistema torna a stare in piedi, consentendo all'utente di cercare con più calma soluzioni più definitive.

Windows 2000 aveva una versione rudimentale di quello che ora si chiama in modo più sofisticato reindirizzamento delle librerie dinamiche. Per abilitare il reindirizzamento delle DLL occorre creare un file con lo stesso nome del programma le cui DLL si desidera reindirizzare, ma con estensione .local. Ad esempio, per applicare il reindirizzamento al programma C:\Program Files\Litware Inc\Invoice.exe, si dovrà creare il file C:\Program Files\Litware Inc\Invoice.exe.local. Non è importa cosa ci sia dentro il file: l'importante è che esista.

Una volta attivato il reindirizzamento per un programma, tutti i tentativi che quel programma farà per caricare una DLL andranno a cercare nella cartella che contiene il programma prima che nelle solite posizioni. Quindi, in caso di conflitto sul file MSVCRT.DLL, potete attivare il reindirizzamento in ogni programma e mettere una copia privata di MSVCRT.DLL nella cartella di ciascuno di essi. Ciascun programma userà allora la sua versione privata di MSVCRT.DLL, quella con cui è stato testato.

La magia di questa tecnica è che funziona anche se il programma usa il percorso completo per caricare la DLL. Per esempio, supponiamo che il programma tenti di caricare C:\Program Files\Common Files\Proseware Inc\taxplugin.dll. Dopo l'aggiornamento a Proseware 2.0, vi accorgete che il suo plug-in per il calcolo delle tasse è incompatibile con il programma di fatturazione. Quello che potete fare è copiare una vecchia versione del plug-in come C:\Program Files\Litware Inc\taxplugin.dll. Anche se il programma usa il percorso completo per caricare il plug-in, il reindirizzamento delle DLL farà sì che la ricerca venga fatta nella cartella corrente e verrà quindi usata la copia locale invece di quella contenuta nella cartella di Proseware Inc.

In Windows XP e Windows Vista™, le regole per il reindirizzamento delle DLL sono un po' diverse, ma il principio generale rimane lo stesso. Oltre che creare un file .local, potete anche creare una cartella .local. In questo caso la ricerca viene fatta nella cartella .local invece che in quella che contiene il programma. Questo permette di applicare il reindirizzamento a più programmi nella stessa cartella senza conflitti.

Tuttavia, non è possibile applicare il reindirizzamento ai programmi che contengono un manifesto dell'applicazione. Anche le cosiddette DLL note sfuggono al reindirizzamento. (Per ulteriori informazioni vedere "Dynamic-Link Library Redirection".)

Il reindirizzamento non offre una via d'uscita completa dall'inferno delle DLL, ma mette comunque a disposizione qualche tecnica di pronto soccorso per curare le ferite prima di iniziare a risolvere davvero il problema.

Figura 1

Figura 1   

Raymond Chen scrive sulla storia di Windows e sulla programmazione Win32 sul suo sito Web, The Old New Thing, e nel suo nuovo libro omonimo The Old New Thing (Addison-Wesley, 2007). Gli mancava soltanto un gatto di nome The Old New Thing...

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.