RegSetKeyValueA函数有向后兼容的替代方法吗?

时间:2019-04-20 17:47:44

标签: c++ winapi windows-xp backwards-compatibility

在我的应用程序中,我使用RegSetKeyValueA将一些激活密钥存储在注册表中。

阻止我的应用与Windows XP向后兼容的唯一瓶颈是RegSetKeyValueA函数。

有什么办法可以解决这个问题?

3 个答案:

答案 0 :(得分:2)

可以使用Windows 2000中的RegSetKeyValueW来轻松实现RegSetValueExW功能

LSTATUS MyRegSetKeyValueW(
                        HKEY    hKey,
                        LPCWSTR lpSubKey,
                        LPCWSTR lpValueName,
                        DWORD   dwType,
                        LPCVOID lpData,
                        DWORD   cbData
                        )
{
    LSTATUS s;

    if (lpSubKey && *lpSubKey)
    {
        s = RegCreateKeyExW(hKey, lpSubKey, 0, 0, 0, KEY_SET_VALUE, 0, &hKey, 0);

        if (s != NOERROR)
        {
            return s;
        }
    }

    s = RegSetValueExW(hKey, lpValueName, 0, dwType, 
        static_cast<PBYTE>(const_cast<void*>(lpData)), cbData);

    if (lpSubKey && *lpSubKey)
    {
        RegCloseKey(hKey);
    }

    return s;
}

,并将自己的代码RegSetKeyValueW替换为MyRegSetKeyValueW。可能对 A 版本执行相同的操作,但需要了解 A 版本将字符串参数转换为unicode,然后调用 W 版本。因此始终最好直接调用 W 版本

答案 1 :(得分:1)

您应该使用RegSetValueExA

由于签名非常相似,很容易混淆两者。

RegSetValueExA

  

支持的最低客户端Windows 2000 Professional [仅桌面应用]

RegSetKeyValueA

  

支持的最低客户端Windows Vista [仅桌面应用]

答案 2 :(得分:0)

使用SHSetValueA(shlwapi.lib),它可以一直工作到IE4(Win98,2000 +)。

如果要设置许多值,则应使用RegCreateKeyA创建密钥,并调用SHSetValueA将NULL作为子密钥。