RegSvr32退出代码文档?

ALZ*_*ALZ 27 windows com dll winapi regsvr32

我玩了RegSvr32.exe注册COM服务器并获得下一个退出代码:

0 - 正确注册正常的DLL Com Server时

3 - 尝试注册假DLL Com Server时(简单文本文件重命名为.DLL

4 - 尝试注册简单的DLL时,而不是Com Server

问题:我可以在哪里找到所有可能的退出代码及其含义的官方(或非官方但好的)描述?

在互联网上搜索没有给我结果,所以我发现这个主题在哪里写的退出代码与Windows系统错误代码相同,但我不明白为什么然后当尝试注册坏文件我得到代码= 3= ERROR_PATH_NOT_FOUND,并在注册非COM DLL时 - 4= ERROR_TOO_MANY_OPEN_FILES?对我来说,这听起来并不合乎逻辑.

Ben*_*Ben 37

退出代码未记录.文档在这里:

但是,版本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.
Run Code Online (Sandbox Code Playgroud)

阅读源代码表明,在任何情况下都不会返回任何其他代码而不是上述代码,并且成功为零,这证明它与Windows代码不同.

我怀疑返回码的不同之处在于,如果它到达GetProcAddress,它会从它调用的函数返回退出代码,而不是总是返回5.

理想情况下,他们会使用GetLastError来获得更有用的退出代码,但我怀疑有太多的工具(例如第三方安装程序)现在依赖于退出代码2-4,现在改变它已经太晚了.

另请参阅各种regsvr32退出代码的含义是什么?在Raymond Chen的MSDN博客上.

  • 如果找不到要注册的二进制文件,则进程返回0,不幸的是,退出代码作为成功/失败指示符并不十分可靠. (4认同)

Ale*_* K. 13

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
Run Code Online (Sandbox Code Playgroud)

我找不到样本,但如果我谷歌我提取的内容有:http://support.microsoft.com/kb/207132它有匹配的代码,所以看起来KB的演示代码也来自RegSvr .它很容易找出每个失败代码背后的原因.


Bie*_*ing 5

Ben 的回答是正确的,但请注意,如果出现以下情况,也会给出错误代码 3

  • 找不到 .DLL
  • .DLL 被另一个进程锁定,无法读取
  • 该进程没有足够的权限打开文件。例如,在需要时不以管理员权限运行(使用 C 盘上的特定文件或公共文件)

> #define FAIL_LOAD 3 // LoadLibrary Failed

感觉有点模糊,但 LoadLibrary 是指在特定 DLL 中引用的 DLL。使用Depends等应用程序,您可以找到所有引用,包括缺失的引用。请注意,缺少引用并不总是会导致错误代码 3(在 DLL 实际上没有使用它的情况下)