首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegCreateKeyEx()和GetLastError()

RegCreateKeyEx()和GetLastError()
EN

Stack Overflow用户
提问于 2014-08-13 16:46:38
回答 2查看 264关注 0票数 1

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-08-13 17:08:22

为什么RegCreateKeyEx()返回一个长整型,而不是通过SetLastError()设置

错误码?

可能是因为Registry API在Windows还是16位的时候就开始了,那时SetLastError() / GetLastError()函数还不存在。无论是谁添加了32位版本的注册表函数,都认为保持调用风格向后兼容比更新为使用SetLastError()更重要。

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

将其长返回值转换为

,然后用SetLastError()将其设置为全局错误代码,对我来说安全吗?

没什么不可以的。只要您对每个值执行此操作,包括ERROR_SUCCESS。

票数 3
EN

Stack Overflow用户

发布于 2014-08-13 20:13:34

为什么RegCreateKeyEx()返回一个长整型,而不是通过SetLastError()设置

错误码?

如果不是设计这些API的开发团队的一部分,很难说。

将其长返回值转换为

,然后用SetLastError()将其设置为全局错误代码,对我来说安全吗?

安全,但毫无意义。对于使用SetLastError返回错误码的接口,调用者必须在接口调用返回后立即调用GetLastError。否则,执行的任何其他代码将调用SetLastError并销毁原始错误代码的风险很大。

因此,假设您必须立即调用GetLastError,那么您的代码将如下所示:

代码语言:javascript
复制
LONG retval = RegCreateKeyEx(...);
SetLastError((DWORD)err);
DWORD err := GetLastError();

这在某种程度上毫无意义。您应该改为这样写:

代码语言:javascript
复制
DWORD err := (DWORD)RegCreateKeyEx(...);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25281832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档