Подтвердить что ты не робот

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

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

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

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

4 - при попытке зарегистрировать простую DLL, а не Com Server

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

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

4b9b3361

Ответ 1

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

Однако исходный код для версии REGSVR32.EXE поставляется с Visual Studio 2008. Это дает его версию как 4.0.0, так что это не то же самое, что и тот, который поставляется с окнами, который сообщает о версии 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, и уже слишком поздно Измени это.

Ответ 2

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

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

  • .DLL не найден.
  • .DLL был заблокирован другим процессом и не мог быть прочитан
  • у процесса было недостаточно прав на открытие файла. Например, не работает с правами администратора при необходимости (с определенными файлами или обычными файлами на диске C)
<Р → #define FAIL_LOAD 3 // LoadLibrary Failed

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