RegCreateKeyEx()和GetLastError()

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

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

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

Solutions Collecting From Web of "RegCreateKeyEx()和GetLastError()"

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

可能是因为注册表API在Windows仍然是16位时开始生命,并且当时SetLastError() / GetLastError()函数不存在。 无论添加32位版本的注册表函数,决定保持调用风格向后兼容比更新使用SetLastError()更重要。

看到雷蒙德陈的真棒博客(和真棒书) 在这里和这里的相关信息。

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

没有理由不。 只要你为包括ERROR_SUCCESS在内的每个值做这个事情。

为什么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(...);