Документация по кодам выхода 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 25

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

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

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

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

> #define FAIL_LOAD 3 // LoadLibrary Failed

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