Документация по кодам выхода 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
?
Для меня это звучит логически.
Ответы
Ответ 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 фактически не использовала его)