Как записать 64-битное значение как DWORD в реестр Windows - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь записать 64-битное значение как DWORD в реестр Windows.Я пытаюсь это сделать, потому что это то, что UnityEngine.PlayerPrefs делает, и я пытаюсь редактировать эти значения.Как ни странно, PlayerPrefs поддерживает только числа с плавающей запятой, но все же по какой-то причине записывает их как двойные в реестр.

using (RegistryKey rk = Registry.CurrentUser.OpenSubKey("some\\valid\\path", true))
{
    rk.SetValue("VALUE", double.MaxValue, RegistryValueKind.DWord);
}

В результате возникает эта ошибка:

System.ArgumentException: 'Theтип объекта значения не соответствует указанному RegistryValueKind или объект не может быть должным образом преобразован. '

Какой самый простой способ сделать это в C #?

1 Ответ

0 голосов
/ 30 сентября 2018

Нашли способ сделать это:

[DllImport("advapi32.dll")]
static extern uint RegSetValueEx(
    UIntPtr hKey,
    [MarshalAs(UnmanagedType.LPStr)] string lpValueName,
    int Reserved,
    RegistryValueKind dwType,
    IntPtr lpData,
    int cbData);

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern uint RegOpenKeyEx(
    IntPtr hKey,
    string subKey,
    int ulOptions,
    int samDesired,
    out UIntPtr hkResult);

[DllImport("advapi32.dll")]
public static extern int RegCloseKey(UIntPtr hKey);

static public readonly IntPtr HKEY_CURRENT_USER = new IntPtr(-2147483647);

public bool SetNamedValue(string path, string valName, double value)
{
    UIntPtr hKey = UIntPtr.Zero;
    try
    {
        if (RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, 0x20006, out hKey) != 0)
            return false;

        int size = 8;
        IntPtr pData = Marshal.AllocHGlobal(size);
        Marshal.WriteInt64(pData, BitConverter.DoubleToInt64Bits(value));
        if (RegSetValueEx(hKey, valName, 0, RegistryValueKind.DWord, pData, size) != 0)
            return false;
    }
    finally
    {
        if (hKey != UIntPtr.Zero)
            RegCloseKey(hKey);
    }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...