为什么RegCreateKeyEx()
会返回LONG
,而不是通过DWORD
设置SetLastError()
错误代码?
将LONG
返回值转换为DWORD
然后将其设置为SetLastError()
的全局错误代码是否安全?
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724844(v=vs.85).aspx
答案 0 :(得分:3)
为什么RegCreateKeyEx()返回LONG,而不是通过SetLastError()设置DWORD错误代码?
可能是因为当Windows仍然是16位时,Registry API才开始生效,那时SetLastError()
/ GetLastError()
函数并不存在。添加32位版本的注册表功能的人决定保持调用样式向后兼容比更新使用SetLastError()
更重要。
有关相关信息,请参阅Raymond Chen的精彩博客(以及精彩的书籍)here和here。
将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(...);