web-dev-qa-db-fra.com

32 bits DLL "peut ne pas être compatible" sur Server 2008, mais fonctionne sur Server 2003

Nous avons un projet qui compile en COM DLL 32 bits et en COM DLL 64 bits (identique à celui de ma question précédente ). Lorsque j'enregistre les deux sur mon ordinateur Windows 7, les deux s'enregistrent avec succès. Lorsque j'enregistre les deux sur un ordinateur Windows Server 2003, les deux s'enregistrent avec succès.

Mais lorsque j'essaie d'enregistrer les DLL sur un ordinateur SP1 standard de Windows Server 2008 R2, le DLL 64 bits s'enregistre avec succès, mais le 32 bits DLL échoue avec le message (sic):

Le module ""% 1 "" peut ne pas être compatible avec la version de Windows que vous exécutez. Vérifiez si le module est compatible avec une version x86 (32 bits) ou x64 (64 bits) de regsvr32.exe.

Je ne pense pas qu'un DLL 32 bits puisse être compatible avec WS2003 et Win7, mais pas avec WS2008. Ça n'a aucun sens.

Que peut-il se passer?

20
Null Pointers etc.

La version de Regsvr32.exe doit correspondre au format 32/64 bits de la DLL que vous essayez d’enregistrer. Le regsvr32 64 bits ne peut pas charger une dll 32 bits et vice versa.

Vous devrez peut-être explicitement appeler la version 32 bits de regsrv32 située dans% systemroot%\SysWoW64\regsvr32.exe. 

De http://support.Microsoft.com/kb/249873

Regsvr32.exe est fourni avec Microsoft Internet Explorer 3.0 ou version ultérieure, Windows 95 OEM Service Release 2 (OSR2) ou version ultérieure et Windows NT 4.0 Service Pack 5 (SP5) ou version ultérieure. Regsvr32.exe est installé dans le dossier Système (Windows Me/Windows 98/Windows 95) ou System32 (Windows NT/Windows XP/Windows Vista/Windows 7).

Remarque Sur une version 64 bits d'un système d'exploitation Windows, il existe deux versions du fichier Regsv32.exe:

  • La version 64 bits est% systemroot%\System32\regsvr32.exe.
  • La version 32 bits est% systemroot%\SysWoW64\regsvr32.exe. 

Utilisation de Regsvr32.exe RegSvr32.exe a les options de ligne de commande suivantes: Regsvr32 [/ u] [/ n] [/ i [: cmdline]] nomdll

/ u - Annule l'enregistrement du serveur /i - Appelez DllInstall en lui transmettant une option facultative [cmdline]; lorsqu’il est utilisé avec/u appelle la désinstallation de dll /n - n’appelle pas DllRegisterServer; cette option doit être utilisée avec/i /s - Silent; n'affiche aucun message (ajouté avec Windows XP et Windows Vista) Lorsque vous utilisez Regsvr32.exe, il tente de charger le composant et appelle sa fonction DLLSelfRegister. Si cette tentative aboutit, Regsvr32.exe affiche une boîte de dialogue indiquant le succès. Si la tentative échoue, Regsvr32.exe renvoie un message d'erreur. Cela peut inclure un code d'erreur Win32. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article de la base de connaissances Microsoft: 193625 Codes d'erreur WinInet (12001 à 12156) 

14
nullforce

Ce n'est probablement pas le problème dans votre cas, mais peut être utile pour les autres personnes qui trouvent cette question en cherchant dans le même message d'erreur:

J'ai eu un problème similaire: un DLL qui ne s'enregistrerait pas avec la version 32 bits ou 64 bits de RegSvr32. J'ai chargé le DLL Dependency Walker (depend.exe, http://www.dependencywalker.com/ ) et j'ai reçu un message beaucoup plus utile:

Erreur: au moins un fichier n'était pas un module Windows 32 bits ou 64 bits.

L'analyse de la colonne CPU dans la liste des modules a permis d'identifier le module incriminé. (Dans mon cas, le message "Aucune signature DOS ou PE n'a été trouvée. Ce fichier n'est pas un module Windows 32 ou 64 bits valide.")

Morale: Dependency Walker peut vous donner un message d'erreur plus utile que RegSvr32.exe.

6
Dan K

Je l'ai eu enregistré en déplaçant la dll dans le répertoire c:\windows\syswow64\(cela ne fonctionnerait pas dans le répertoire system32) puis en appelant explicitement syswow64\regsvr32, par exemple

c:\windows\syswow64\regsvr32 yourdll.dll

btw cela ne fonctionnerait pas lors de l'appel de c:\windows\syswow64\regsvr32 c:\windows\syswow64\yourdll.dll

2
Rasterman

J'ai le même problème, mais je le résous avec des commandes

CD\windows\syswow64 Regsvr32 c:\nom de fichier. dll

1
madurama

L'exécution de l'invite de commande en tant qu'administrateur a résolu mon problème.

1
user5364342

Utilisez Process Monitor de SysInternals. 

1 . Filtrer par "Nom du processus" = regsvr32.exe .Filter

2 Essayez d’enregistrer votre dll depuis la version correcte de regsvr32.exe (la version 32 bits se trouve dans le dossier SysWow64)

3 Le moniteur de processus retrace TOUT ce qui se passe sur votre ordinateur.

4 Commencez par analyser en éliminant les événements de registre (pour le moment).enter image description here

5 Vous pourrez peut-être voir que la DLL est trouvée et non trouvée. 

Voici une capture d'écran (très) partielle de regsvr32.exe de Threed32.ocx où nous pouvons voir certaines des dll nécessaires.enter image description here

6 Votre travail ne fait que commencer. À partir de maintenant.

0
Guish