RegCreateKeyEx()和GetLastError()

时间:2014-08-13 08:46:38

标签: c windows visual-studio winapi registry

为什么RegCreateKeyEx()会返回LONG,而不是通过DWORD设置SetLastError()错误代码?

LONG返回值转换为DWORD然后将其设置为SetLastError()的全局错误代码是否安全?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724844(v=vs.85).aspx

2 个答案:

答案 0 :(得分:3)

  

为什么RegCreateKeyEx()返回LONG,而不是通过SetLastError()设置DWORD错误代码?

可能是因为当Windows仍然是16位时,Registry API才开始生效,那时SetLastError() / GetLastError()函数并不存在。添加32位版本的注册表功能的人决定保持调用样式向后兼容比更新使用SetLastError()更重要。

有关相关信息,请参阅Raymond Chen的精彩博客(以及精彩的书籍)herehere

  

将LONG返回值转换为DWORD然后使用SetLastError()将其设置为全局错误代码是否安全?

没有理由不这样做。只要您为包括ERROR_SUCCESS在内的每个值执行此操作。

答案 1 :(得分:2)

  

为什么RegCreateKeyEx()返回LONG,而不是通过SetLastError()设置DWORD错误代码?

很难说,没有成为设计这些API的开发团队的一员。

  

将LONG返回值转换为DWORD然后使用SetLastError()将其设置为全局错误代码是否安全?

安全,但毫无意义。使用SetLastError返回错误代码的API,调用者必须在API调用返回后立即调用GetLastError。否则,执行的任何其他代码都会调用SetLastError并销毁原始错误代码。

因此,鉴于您必须立即致电GetLastError,您的代码将如下所示:

LONG retval = RegCreateKeyEx(...);
SetLastError((DWORD)err);
DWORD err := GetLastError();

这有点无意义。你应该写:

DWORD err := (DWORD)RegCreateKeyEx(...);