我正在尝试获取通常为 REG_SZ 类型的值的数据,但我也想支持它是 REG_EXPAND_SZ 的可能性。
我试过这个:
RegGetValue(HKEY_LOCAL_MACHINE, subkey, valueName, RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ, NULL, buffer, &bufferSize)
Run Code Online (Sandbox Code Playgroud)
但它返回 87(“参数不正确”)。
如果我单独通过其中一个RRF_RT_REG_SZ或两个,它就可以正常工作,但当我同时指定两者时,它就不行了。RRF_RT_REG_EXPAND_SZ我不想将我的支票限制为一种特定类型。MSDN 说我可以使用“以下一个或多个”作为该参数。
为什么我会收到此错误以及如何解决它?
我已确认这是 Windows 7 的一个错误。在Windows 7及更早版本中,该函数的实现RegGetValue包含以下代码:
if (((dwFlags & RRF_RT_ANY) != RRF_RT_ANY) && \n (dwFlags & RRF_RT_REG_EXPAND_SZ) && \n !(dwFlags & RRF_NOEXPAND))\n{\n return ERROR_INVALID_PARAMETER;\n}\nRun Code Online (Sandbox Code Playgroud)\n因此,即使仅使用该RRF_RT_REG_EXPAND_SZ标志也会产生“无效参数”错误(错误代码87)。
从 Windows 8.1 开始,此错误已得到修复。在 Windows 8.1 和 Windows 10 上,我已确认该功能可以正常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”类型的值不会为您扩展\xe2\x80\x94,为此,您需要直接调用ExpandEnvironmentStrings. 此外,您还需要使用dwType参数来准确确定您拥有的数据类型,因为您在掩码中允许使用多种类型。