我试图为一个通常为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_SZ或RRF_RT_REG_EXPAND_SZ,它就能正常工作,但当我同时指定两者时,情况就不是这样了。我不想把支票限制在一种特定的类型上。MSDN说,对于该参数,我可以使用“以下一个或多个”。
为什么我要得到这个错误,我如何解决它?
发布于 2017-11-03 14:16:11
我已经确认这是Windows 7的错误。在Windows 7和更早版本中,RegGetValue函数的实现包含以下代码:
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参数来确定您有哪种类型的数据,因为您允许在掩码中输入多个类型。
https://stackoverflow.com/questions/47096940
复制相似问题