web-dev-qa-db-fra.com

Documentation des codes de sortie RegSvr32?

J'ai joué avec RegSvr32.exe pour enregistrer un serveur COM et obtenir les prochains codes de sortie:

0 - lors de l'enregistrement correctement normal DLL Com Server

3 - lorsque vous essayez d'enregistrer un faux DLL Com Server (fichier texte simple renommé en .DLL

4 - lorsque vous essayez d'enregistrer une DLL simple, pas Com Server

Question: où puis-je trouver une description officielle (ou non officielle mais bonne) de tous les codes de sortie possibles et leur signification?

La recherche sur Internet ne m'a pas donné de résultat, sur SO J'ai trouvé cette rubrique où est écrit que les codes de sortie sont les mêmes avec le code d'erreur du système Windows, mais je ne l'ai pas fait ne comprends pas pourquoi, alors quand j'enregistre un mauvais fichier, j'obtiens du code = 3 = ERROR_PATH_NOT_FOUND, et lors de l'enregistrement non-COM DLL - 4 = ERROR_TOO_MANY_OPEN_FILES? Pour moi, cela ne semble pas logique.

27
ALZ

Les codes de sortie ne sont pas documentés. La documentation est ici:

Toutefois, le code source d'une version REGSVR32.EXE est fourni avec Visual Studio 2008. Cela donne sa version 4.0.0, ce n'est donc pas la même que celle fournie avec Windows, qui rapporte la version 6.

Un coup d'œil rapide montre ces:

#define FAIL_ARGS   1 // Invalid Argument
#define FAIL_OLE    2 // OleInitialize Failed
#define FAIL_LOAD   3 // LoadLibrary Failed
#define FAIL_ENTRY  4 // GetProcAddress failed
#define FAIL_REG    5 // DllRegisterServer or DllUnregisterServer failed.

La lecture du code source suggère qu'en aucun cas il ne renvoie un autre code que ceux ci-dessus et zéro pour le succès, ce qui prouve qu'il n'est pas le même que celui de Windows.

Je soupçonne que la différence dans les codes de retour est que si elle va jusqu'à GetProcAddress, elle renvoie ensuite le code de sortie de la fonction qu'elle appelle, au lieu de toujours renvoyer 5.

Idéalement, ils l'auraient fait utiliser GetLastError pour obtenir un code de sortie plus utile, mais je soupçonne qu'il y a trop d'outils (par exemple, des programmes d'installation tiers) qui dépendent maintenant des codes de sortie 2-4, et il est trop tard pour le changer.

Voir aussi Que signifient les différents codes de sortie regsvr32? sur le blog de Raymond Chen sur MSDN.

37
Ben

Visual Studio était fourni avec un exemple MFC qui était en fait la source de l'utilitaire RegSvr32 et je me souviens avoir parcouru cela pour récolter les codes de sortie:

FAIL_ARGS   1
FAIL_OLE    2
FAIL_LOAD   3
FAIL_ENTRY  4  // Not ERROR_TOO_MANY_OPEN_FILES but as expected "could not resolve 
               // DLLRegisterServer" as your using an invalid DLL
FAIL_REG    5

Je ne trouve pas l'exemple, mais si je Google pour ce que j'ai extrait il y a ceci: http://support.Microsoft.com/kb/207132 qui a des codes correspondants de sorte qu'il ressemble à ce KB le code de démonstration a également été extrait de RegSvr. Son trivial pour trouver les raisons derrière chacun des codes d'échec.

13
Alex K.

La réponse de Ben est correcte, cependant, notez que le code d'erreur 3 est également donné comme résultat si

  • le .DLL est introuvable
  • le .DLL a été verrouillé par un autre processus et n'a pas pu être lu
  • le processus ne disposait pas de droits suffisants pour ouvrir le fichier. Par exemple, ne pas exécuter avec les droits d'administrateur en cas de besoin (avec des fichiers spécifiques ou des fichiers communs sur le lecteur C)

> #define FAIL_LOAD 3 // LoadLibrary Failed

Cela semble un peu vague, mais la bibliothèque de chargement est conçue comme des DLL référencées dans la DLL spécifique. En utilisant une application telle que Depends , vous pouvez trouver toutes les références, y compris celles manquantes. Notez qu'une référence manquante n'entraîne pas toujours un code d'erreur 3 (dans les cas où DLL ne l'a pas réellement utilisé)

4