Есть ли какая-либо обратно совместимая альтернатива функции RegSetKeyValueA? - PullRequest
0 голосов
/ 20 апреля 2019

В своем приложении я использую RegSetKeyValueA для хранения некоторых ключей активации в реестре.

Единственное узкое место, которое мешает моему приложению быть обратно совместимым с Windows XP, это RegSetKeyValueA функция.

Есть ли способ обойти это?

Ответы [ 3 ]

2 голосов
/ 20 апреля 2019

Функцию RegSetKeyValueW можно легко реализовать с помощью RegSetValueExW, существующей в Windows 2000

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 version. так что всегда лучше прямой звонок Ш версия

1 голос
/ 20 апреля 2019

Вы должны использовать RegSetValueExA

Это очень легко спутать из-за похожих очень похожих подписей.

RegSetValueExA

Минимально поддерживаемый клиент Windows 2000 Professional [только для настольных приложений]

RegSetKeyValueA

Минимально поддерживаемый клиент Windows Vista [настольные приложениятолько]

0 голосов
/ 21 апреля 2019

Используйте SHSetValueA (shlwapi.lib), он работает вплоть до IE4 (Win98,2000 +).

Если вы устанавливаете много значений, вы должны использовать RegCreateKeyA для создания ключа, и вызов SHSetValueA будет иметь значение NULL в качестве подключа.

...