为什么RegCreateKeyEx()返回LONG,而不是通过SetLastError()设置DWORD错误码
将其LONG返回值转换为DWORD,然后使用SetLastError()将其设置为全局错误代码是否安全
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724844(v=vs.85).aspx
发布于 2014-08-13 17:08:22
为什么RegCreateKeyEx()返回一个长整型,而不是通过SetLastError()设置
错误码?
可能是因为Registry API在Windows还是16位的时候就开始了,那时SetLastError() / GetLastError()函数还不存在。无论是谁添加了32位版本的注册表函数,都认为保持调用风格向后兼容比更新为使用SetLastError()更重要。
请参阅Raymond Chen的精彩博客(以及精彩的书籍) here和here以获取相关信息。
将其长返回值转换为
,然后用SetLastError()将其设置为全局错误代码,对我来说安全吗?
没什么不可以的。只要您对每个值执行此操作,包括ERROR_SUCCESS。
发布于 2014-08-13 20:13:34
为什么RegCreateKeyEx()返回一个长整型,而不是通过SetLastError()设置
错误码?
如果不是设计这些API的开发团队的一部分,很难说。
将其长返回值转换为
,然后用SetLastError()将其设置为全局错误代码,对我来说安全吗?
安全,但毫无意义。对于使用SetLastError返回错误码的接口,调用者必须在接口调用返回后立即调用GetLastError。否则,执行的任何其他代码将调用SetLastError并销毁原始错误代码的风险很大。
因此,假设您必须立即调用GetLastError,那么您的代码将如下所示:
LONG retval = RegCreateKeyEx(...);
SetLastError((DWORD)err);
DWORD err := GetLastError();这在某种程度上毫无意义。您应该改为这样写:
DWORD err := (DWORD)RegCreateKeyEx(...);https://stackoverflow.com/questions/25281832
复制相似问题