Как передать (byte [] lpData) с целочисленным значением в RegSetValueExW P / Invoke - PullRequest
0 голосов
/ 14 января 2009

У меня есть этот P / Invoke RegSetValueExW, который устанавливает значение для раздела реестра. в C #

[DllImport("coredll.dll", EntryPoint = "RegSetValueExW")]
public static extern int RegSetValueExW(uint hKey, string lpValueName,
            uint lpReserved,
            uint lpType,
            byte[] lpData,
            uint lpcbData);

У меня проблема с байтом 4-го параметра [] lpdata. Мне нужно передать DWORD со значением 5 (int). Все в порядке, если я передаю строку (REG_SZ), просто нужно конвертировать с помощью функции GetBytes.

Если я вызываю GetBytes ("5"), он конвертирует его в значение ascii из 53, поэтому он записывает 53 в значение реестра вместо 5

Ответы [ 3 ]

2 голосов
/ 14 января 2009

Я должен начать с вопроса, почему вы используете PInvoke, когда уже есть метод для установки значений реестра в классе Microsoft.Win32.RegistryKey? Или вы застряли, используя старую версию Compact Framework?

Если у вас есть веская причина для PInvoke, самый простой ответ - просто перегрузить объявление PInvoke для целочисленных значений. i.e.:

[DllImport("coredll.dll", EntryPoint = "RegSetValueExW")]
public static extern int RegSetValueExW(uint hKey, string lpValueName,
        uint lpReserved,
        uint lpType,
        ref int lpData,
        uint lpcbData);
1 голос
/ 14 января 2009

Используйте REG_DWORD вместо REG_SZ, а затем используйте BitConverter.GetBytes (Int32) для преобразования int в байт [].

0 голосов
/ 14 января 2009

Если вам нужно передать целочисленное значение, вы можете просто привести его к байту

byte[] lpData = new byte[] { (byte)5 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...