首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegGetValue表示可能是REG_SZ或REG_EXPAND_SZ的值

RegGetValue表示可能是REG_SZ或REG_EXPAND_SZ的值
EN

Stack Overflow用户
提问于 2017-11-03 13:29:10
回答 1查看 654关注 0票数 1

我试图为一个通常为REG_SZ类型的值获取数据,但我也希望支持它是REG_EXPAND_SZ的可能性。

我试过这个:

代码语言:javascript
复制
RegGetValue(HKEY_LOCAL_MACHINE, subkey, valueName, RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ, NULL, buffer, &bufferSize)

但是它返回87 (“不正确的参数”)。

如果我单独传递RRF_RT_REG_SZRRF_RT_REG_EXPAND_SZ,它就能正常工作,但当我同时指定两者时,情况就不是这样了。我不想把支票限制在一种特定的类型上。MSDN说,对于该参数,我可以使用“以下一个或多个”。

为什么我要得到这个错误,我如何解决它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-03 14:16:11

我已经确认这是Windows 7的错误。在Windows 7和更早版本中,RegGetValue函数的实现包含以下代码:

代码语言:javascript
复制
if (((dwFlags & RRF_RT_ANY) != RRF_RT_ANY) && 
    (dwFlags & RRF_RT_REG_EXPAND_SZ) && 
    !(dwFlags & RRF_NOEXPAND))
{
  return ERROR_INVALID_PARAMETER;
}

因此,即使只使用RRF_RT_REG_EXPAND_SZ标志也会产生“无效参数”错误(错误代码87)。

此错误已从Windows8.1开始修复。在Windows8.1和Windows10上,我都确认了RRF_RT_REG_SZ|RRF_RT_REG_EXPAND_SZ没有错误。

如果您需要针对Windows 7和更早版本,可以通过添加RRF_NOEXPAND标志来解决这个问题。换句话说,如果您传递以下组合的标志:

RRF_RT_REG_SZ|RRF_RT_REG_EXPAND_SZ|RRF_NOEXPAND

当然,这意味着"expand_sz“类型的值不会为您展开-为此,您需要对ExpandEnvironmentStrings进行直接调用。此外,您还需要使用dwType参数来确定您有哪种类型的数据,因为您允许在掩码中输入多个类型。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47096940

复制
相关文章

相似问题

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