2012-07-30 1 views
5

Lorsque je tente d'enregistrer la version 32 bits de mon projet C++/ATL avecLoadLibrary project.dll a échoué. Le module spécifié est introuvable

regsvr32 project.dll 

je reçois cette erreur:

LoadLibrary("project.dll") failed - The specified module could not be found 

projet.dll est ma DLL a été créée en utilisant ATL sur Visual Studio 10.

La version 64 bits s'est bien enregistrée.

Qu'est-ce qui me manque?

+0

Où est project.dll? dans le même répertoire que celui où vous appelez cette commande? Sur le chemin? – stijn

+0

oui c'est dans le même répertoire (sinon j'obtiendrais une erreur disant qu'un tel fichier n'existe pas!) – Danield

+2

puis ouvrez la DLL dans le dépendant de la dépendance et voyez ce que les DLL manquent – stijn

Répondre

5

J'ai observé cette même erreur, mais la solution n'installait pas le redistribuable. Toutes les DLL dépendantes étaient présentes sur le système selon depends.exe.

Dans mon cas, l'icône de KERNEL32.DLL était légèrement teintée en rouge. Depends.exe n'a pas offert beaucoup d'explication, mais creuser autour a révélé que l'une des fonctions importées manquait de la DLL sur le système. Pour voir les fonctions importées, sélectionnez la DLL dépendante dans l'arborescence et recherchez l'importation dans le panneau de droite. Ordre par la colonne PI pour voir les icônes rouges des importations manquantes.

Seeing the missing import

Dans mon cas, la fonction manquante était une fonction qui n'existait pas sur mon triste système d'exploitation cible, Windows XP. Depuis mon programme ne dépendait pas directement sur cette fonction, j'ai pu sortir avec #define ing ce qui suit dans mon projet:

#define WINVER 0x0501 
#define _WIN32_WINNT 0x0501 

Compiler avec ces macros fait donc la fonction en question n'a pas été déclarée dans les en-têtes , et par conséquent non importé au moment du chargement. Maintenant, j'étais capable d'utiliser regsvr32. Ceci est bien sûr un cas très spécifique (et chanceux). Je ne dépendais pas de cette importation ou de toute autre API plus récente, donc je pouvais m'en sortir en reciblant le projet. Si ce n'était pas une DLL système, j'aurais eu besoin de trouver une version plus récente qui pourrait facilement conduire à un besoin de mettre à jour un sous-arbre entier du graphe de dépendance. Ou pire encore, si je dépendais des importations manquantes, il faudrait procéder à un refactoring sérieux.

Pour résumer, ce message d'erreur peut être causée par les questions suivantes:

  1. Le fichier DLL n'a pas été trouvé ou n'a pas pu être lu. Vérifiez la ligne de commande.
  2. Certaines DLL dépendantes n'ont pas été trouvées ou n'ont pas pu être lues.
  3. Certaines importations sont manquantes dans certaines DLL dépendantes. Si ce sont des DLL système, vous ciblez probablement une mauvaise version de Windows. S'il s'agit de DLL non-système, vous devez installer des versions plus récentes d'elles et de toutes leurs dépendances.

1 .: En dehors de Ieshims.dll et wer.dll qui est apparemment un bug dans ce vieil outil.
2 .: Ou vraiment, des problèmes dans le chargement des DLL sur un système particulier

+0

Bien que je ne travaille pas sur ce projet plus et n'ont pas la capacité de vérifier cela, cela semble être la bonne façon d'aborder ce problème. +1 - Merci! – Danield

2

La description de l'erreur est trompeuse dans ce cas. Le système trouve votre DLL (project.dll) mais une (ou plusieurs) dépendance de votre DLL peut être manquante.

+2

Inspectez votre (version 32 bits) de votre DLL avec Dependency walker (http://www.dependencywalker.com/) pourrait aider – mox

+0

J'ai essayé ceci, et il a montré que quelques DLL étaient manquantes, mais quand j'ai téléchargé ces DLLs et les ai ajoutées au même répertoire que le dll de projet - chaque fois Walker de répertoire trouvé un nouveau jeu de DLL manquantes – Danield

+1

En fait, certaines images ont des sous-dépendances! Toutes les dépendances statiques (directes et indirectes) doivent être résolues avant que le chargeur Windows puisse démarrer (dans votre cas inscrire) une application. – mox

1

Je viens d'installer

Microsoft Visual C++ 2010 Redistributable Package 

et maintenant je peux installer la dll.

Bien que cela fonctionne, je ne suis pas trop content de cela, car je ne veux pas avoir à installer ce paquet sur un client pour que ma DLL fonctionne par eux.

+0

Je viens de remarquer que dans l'installateur que j'utilise, il y a une option pour inclure ce paquet comme condition préalable - donc le programme d'installation ira télécharger le paquet si l'utilisateur ne l'a pas déjà installé – Danield

Questions connexes