【问题标题】:Does LoadLibrary return NULL or an error code < 32 on failure?LoadLibrary 是否在失败时返回 NULL 或错误代码 < 32?
【发布时间】:2015-06-16 18:24:32
【问题描述】:

MSDN documentation 状态

如果函数成功,返回值是模块句柄。

如果函数失败,返回值为NULL。要获取更多错误信息,请致电GetLastError

Microsoft support 有一个小于 32 的返回值列表,表示错误

API 函数LoadLibrary 加载 DLL 并返回句柄或错误代码。如果返回值小于 32,则表示出现下列错误之一。返回值大于等于 32 表示成功,应调用FreeLibrary 函数卸载库。

第二篇文章最后一次审查是在 2003 年,明确适用于 Visual Basic 4.0。

什么是正确的? LoadLibrary 返回 != 0&gt;= 32 是否成功?或者两者都是正确的,我错过了一些关于版本差异或与 C 样式接口不同的 VB 特定 Windows API 包装器的提示?

【问题讨论】:

  • 在 C 中传递无效文件名的快速测试返回 NULL,而不是您链接的 VB 文档中列出的 2(未找到文件)。
  • @WeatherVane 这证明不了
  • @DavidHeffernan 这就是为什么我将我的观察作为评论而不是答案发布的原因。
  • @WeatherVane 谢谢。当然,在提问之前我也做过这种测试,但是提到每一次尝试和错误尝试来解决这个问题可能会让这个问题变得臃肿。
  • @Weather:这甚至不是一个有用的评论。你不能从观察中推断出合同保证。提出其他建议是根本错误的。

标签: winapi


【解决方案1】:
  • 在 32 位和 64 位 Windows 中,LoadLibrary 在失败时返回 NULL
  • 在 16 位 Windows 中,LoadLibrary 返回小于 32 的值以指示失败。

KB142814 显然可以追溯到 16 位 Windows 时代,如果您仔细观察,您会看到一个 kb16bitonly 关键字。我认为可以安全地假设您不再为 16 位 Windows 进行开发!

Raymond Chen关于此事的一些相关文章:

LoadLibrary 的现代文档在这里:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175.aspx,这是您问题中的第一个链接。它说:

返回值

如果函数成功,返回值是模块句柄。

如果函数失败,返回值为NULL。要获取扩展的错误信息,请调用 GetLastError。

【讨论】:

  • 感谢您解决这个问题。我确实注意到了 kb16bitonly 标记,但是“适用于:[...]。Microsoft Visual Basic 4.0 32 位企业版 [...]”再次让我误入歧途。
  • @die_hoernse VB4 可以产生 16 位和 32 位输出,IIRC。它跨越了过渡期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多