Документация кодов выхода RegSvr32?

я играл с RegSvr32.exe зарегистрировать COM-сервер и получить следующие коды выхода:

0 - при правильной регистрации обычного DLL Com сервера

3 - при попытке регистрации поддельного DLL Com-сервера (простой текстовый файл переименован в .Dll файлы

4 - при попытке регистрации простой DLL, а не Com-сервер

вопрос: где я могу найти официальное (или неофициальное, но хорошее) описание всех возможных кодов выхода и их смысл?

поиск в Интернете не дал мне результата, поэтому я нашел этой теме где написано, что коды выхода одинаковы с кодом ошибки системы windows, но я не понял, почему тогда при попытке регистрации плохого файла я получаю код = 3 = ERROR_PATH_NOT_FOUND, а при регистрации non-COM DLL -4 = ERROR_TOO_MANY_OPEN_FILES? Для меня это звучит нелогично.

3 ответов


коды выхода не документированы. Документация здесь:

однако исходный код для версии REGSVR32.EXE поставляется с Visual Studio 2008. Это дает его версию как 4.0.0, поэтому не совпадает с той, которая поставляется с windows, которая сообщает версию 6.

быстрый взгляд показывает это:

#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.

чтение исходного кода предполагает, что ни при каких обстоятельствах он не возвращает никакого другого кода, кроме приведенных выше и нулевых для успеха, что доказывает, что это не то же самое, что и Windows.

Я подозреваю, что разница в кодах возврата, если она доходит до GetProcAddress, затем возвращает выход код из функции, которую он вызывает, вместо того, чтобы всегда возвращать 5.

В идеале они бы использовали GetLastError для получения более полезного кода выхода, но я подозреваю, что слишком много инструментов (например, сторонних программ установки), которые теперь зависят от кодов выхода 2-4, и слишком поздно менять его.

см. Также что означают различные коды выхода regsvr32? в блоге Раймонда Чена на MSDN.


Visual Studio используется для доставки с образцом MFC, который на самом деле был источником для утилиты RegSvr32, и я помню, что прошел через это, чтобы собрать коды выхода:

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

Я не могу найти образец, но если я Google для того, что я извлек, есть это:http://support.microsoft.com/kb/207132 который имеет соответствующие коды, поэтому похоже, что демо-код KB также был взят из RegSvr. Его тривиально, чтобы выяснить причины каждого из кодов сбоя.


ответ Бена правильный, хотя, обратите внимание, что код ошибки 3 также дается в результате, если

  • the .DLL не удалось найти
  • the .DLL была заблокирована другим процессом и не могла быть прочитана
  • процесс недостаточно прав для открытия файла. Например, не работает с правами администратора, когда это необходимо (с конкретными файлами или общими файлами на диске C)

> #define FAIL_LOAD 3 // LoadLibrary Failed

немного расплывчато, но LoadLibrary подразумевается как DLL, упомянутые в конкретной DLL. Использование таких приложений, как зависит, вы можете найти все ссылки, в том числе отсутствующие. Обратите внимание, что отсутствующая ссылка не всегда приводит к коду ошибки 3 (в случаях, когда DLL фактически не использовал его)