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
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)).
paramètres
panneau de configuration
système
avancé
variables d'environnement
Pathde la partie
Variables système
quelque soit la methode utilisée, il faut ensuite rebooter le système pour prendre en compte les modifications.
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
.