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