patch1

Lors de l'installation de notre imprimante virtuelle sur un système Windows XP ou supérieur, il arrive que l'on est le message d'erreur : Le module spécifié est introuvable

Explication du problème

Lors de l'installation de certains logiciels la variable d'environnement path est modifié dans la base de registres de Windows. Cette variable a changé de type dans la base de registre de Windows avec WindowsXP, et les anciens logiciels modifie ce type lorsqu'ils la mettent à jour.

La variable path permet la recherche de DLLs système et est utilisé par celui-ci lors de l'utilisation de la fonction AddPrinterDriver permettant l'installation d'une nouvelle imprimante.

La valeur du registre \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment\path (correspondant à la variable d'environnement path) était de type REG_SZ (une chaîne de caractères) et est maintenant de type REG_EXPAND_SZ (une chaîne de caractères pouvant contenir des variables). En fait, ce registre contient des variables de type %SystemRoot% qui doivent être remplacées par la valeur de la variable SystemRoot, généralement c:\WINDOWS\SYSTEM32. Mais ce remplacement ne se fait sous WindowsXP que si le type du registre est REG_EXPAND_SZ, sinon le chemin n'existe pas, les DLL ne sont pas trouvés et donc la fonction utilisant la DLL plante avec le message The specified module could not be found. (Le module spécifié est introuvable) (erreur Windows ERROR_MOD_NOT_FOUND (numéro 126)).

Correctif du problème

    Pour corriger le problème, trois solutions sont possibles :
  1. Télécharger notre patch (télécharger) et l'exécuter
  2. Modifier la base de registre avec l'outil Microsoft regedit (renommer le registre path puis créé en un nouveau)
  3. Faites :
    • Démarrer
    • paramètres
    • panneau de configuration
    • système
    • onglet avancé
    • bouton variables d'environnement
    • double-cliquez sur la ligne Path de la partie Variables système
    • faites une modification dans le champ (ajout d'un espace par example) et validé

quelque soit la methode utilisée, il faut ensuite rebooter le système pour prendre en compte les modifications.

Du point de vue du programmeur

Le problème vient de la mauvaise utilisation de RegQueryValueEx et RegSetValueEx. RegQueryValueEx prend en paramètre un LPDWORD lpType qui renvoi le type du registre (dans notre cas REG_SZ ou REG_EXPAND_SZ), et RegSetValueEx prend en paramètre un DWORD dwType.

Certains programmeurs sachant que le registre path est de type REG_SZ, on mis le type en dur dans l'appel de la fonction RegSetValueEx à la place de de récupérer la valeur renvoée par RegQueryValueEx. Microsoft ayant changé le type du registre dans à partir de Windows XP (SP2)... Les outils accèdant à ce registre sont suceptible de planter (suivant ce qu'ils en font). La fonction AddPrinterDriver fournie par Microsoft a besoin pour fonctionner que le type soit correct, sinon le système n'arrive pas à trouver framdyn.dll.