RegGetValue的值可以是REG_SZ或REG_EXPAND_SZ

时间:2017-11-03 13:29:11

标签: winapi

我正在尝试获取通常为REG_SZ类型的值的数据,但我也想支持它是REG_EXPAND_SZ的可能性。

我试过了:

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说我可以为该参数使用“以下一个或多个”。

为什么我会收到此错误,如何解决?

1 个答案:

答案 0 :(得分:3)

这是Windows 7的错误。但是这里将使用RRF_RT_REG_SZ|RRF_RT_REG_EXPAND_SZ|RRF_NOEXPAND标志 - 结果使用RRF_NOEXPAND expand_sz字符串将不会展开(需要直接调用ExpandEnvironmentStrings),当然需要使用 dwType 如果我们在掩码中接受多个类型,则确切地知道哪个类型有数据。

从win8.1开始 - RRF_RT_REG_SZ|RRF_RT_REG_EXPAND_SZ无错误地工作

Windows 7(及早期)中的

在函数

中存在下一个代码
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标志,我们也得到了相同的错误。