2009-10-15 8 views
3

Je construis un projet dans VS2005 et plusieurs de mes DLLs ne parviennent pas à s'enregistrer. Le message d'erreur que j'obtiens dans Visual Studio est:Pourquoi ma DLL ne parvient-elle pas à s'inscrire?

Project : error PRJ0019: A tool returned an error code from "Registering ActiveX Control..."

ce qui est joliment vague. Quand j'enregistrer la DLL manuellement via la ligne de commande (en utilisant regsv32.exe, je reçois l'erreur suivante:

LoadLibrary("test.ocx") failed - This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix the problem.

Je couru Dependency Walker (depends.exe) sur le coupable .ocx mais il ne montre aucun des problèmes évidents.

J'ai aussi fait une nouvelle construction mais je reçois toujours le même problème.

des suggestions quant à la façon dont je pourrais déterminer la cause de ce défaut d'enregistrement?

Répondre

3

Microsoft avait récemment publié une mise à jour de sécurité pour ATL (KB971090). C'est une mise à jour au-dessus de MSVS2005sp1 et c'est à la fois un compilateur et un disjoncteur de compatibilité d'exécution. Vérifiez si votre environnement de construction a ce correctif.

Références:

+0

+1 pour le dernier lien. C'est l'explication; J'ai changé la réponse acceptée à celui-ci maintenant. – LeopardSkinPillBoxHat

2

Probablement la meilleure façon pour résoudre cette catégorie entière de problème est d'installer Process Monitor from microsoft.com.

Process Montior vous permet d'observer les processus d'appels système et, dans ce cas, vous pouvez voir si un appel système échoue. Par exemple, si vous ne disposez pas d'une dépendance, un appel CreateFile() sera vu échouer avec une DLL, OCX, etc. comme nom de fichier.

Lancez procmon et configurez le filtre pour exclure les événements autres que regsvr32.exe, reproduisez votre scénario de test, puis vérifiez le journal. Recherchez les erreurs NAME_NOT_FOUND dans la colonne de valeur de retour.

+0

Oui, donc de nombreux problèmes peuvent être diagnostiqués avec juste Pro moniteur. – sharptooth

3

le plus probable est que les manifestes embarqués. Vous devez prendre une application d'exploration de ressources et vérifier vos DLL pour les manifestes incorporés. Il se peut que l'une des DLL dépendantes (ou votre DLL) nécessite certaines versions d'autres DLL qui n'existent pas.

J'ai reçu ce message: "Cette application n'a pas pu démarrer car la configuration de l'application est incorrecte." en cas de brouillards manifestes incorporés.

+0

Cela semble l'explication la plus probable jusqu'à présent - je pense que cela a quelque chose à voir avec un correctif qui a mis à jour une DLL dans un redistribuable. Avez-vous plus d'informations sur la façon de vérifier quelle version de la DLL redistribuable ma DLL recherche? – LeopardSkinPillBoxHat

+0

Je sais que j'ai eu des problèmes avec SP1 de VS2005, qui a changé la version de MSVCRT dlls. Ce que j'ai fait est de vérifier les dépendances (par exemple en utilisant Dependency Walker) puis prendre chaque DLL (y compris la mienne) et vérifier le manifeste incorporé (le cas échéant) pour voir la version de la DLL et la version requise spécifiée dans le manifeste de la dépendante. DLL Très probablement à cause du patch DLL de la bibliothèque standard. En cas de versions incompatibles, j'ai été contraint de reconstruire ces DLL aussi. –

0

Il y a plusieurs choses que vous pouvez essayer:

  • regsvr32 try w/log de fusion activée (fuslogvw.exe - il fonctionne pour dll non gérés ainsi). Cela vous donnera un peu plus d'informations que cela dépend de ce que les dépendances externes sont chargées, d'où sont-elles chargées et quelles erreurs ont été touchées.
  • Copiez le .ocx et ses dépendances dans la racine ou dans un dossier de premier niveau et essayez de vous inscrire à partir de là. Je ne me souviens pas des détails, mais il y avait un vieux problème avec l'enregistrement d'une DLL COM de l'intérieur trop profond d'un chemin. Exécutez regsvr32 sous WinDbg. Définir un point d'arrêt DllMain et voir si cela fait quelque chose de génial.
  • Si vous ne cassez jamais DllMain dans WinDbg, définissez un breakpoint on module load pour votre DLL et une fois qu'il est atteint, vous pouvez soit passer par LoadLibrary, ou simplement définir un point d'arrêt de bibliothèque de chargement générique et vérifier chaque dll après cela.
Questions connexes