0

我有这个 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 个参数 byte[] lpdata 有问题。我需要传递一个值为 5 (int) 的 DWORD。如果我传递一个字符串 (REG_SZ),一切正常,只需要使用 GetBytes 函数进行转换。

如果我调用 GetBytes("5") 它将其转换为 53 的 ascii 值,因此它将 53 写入注册表值而不是 5

4

3 回答 3

2

我首先要问你为什么在 Microsoft.Win32.RegistryKey 类中已经有设置注册表值的方法时在这里使用 PInvoke?或者您是否还在使用旧版本的 Compact Framework?

假设您对 PInvoke 有充分的理由,最简单的答案就是为整数值重载 PInvoke 声明。IE:

[DllImport("coredll.dll", EntryPoint = "RegSetValueExW")]
public static extern int RegSetValueExW(uint hKey, string lpValueName,
        uint lpReserved,
        uint lpType,
        ref int lpData,
        uint lpcbData);
于 2009-01-14T16:19:07.177 回答
1

使用 REG_DWORD 而不是 REG_SZ,然后使用 BitConverter.GetBytes(Int32) 将 int 转换为 byte[]。

于 2009-01-14T16:23:00.117 回答
0

如果您需要传递一个整数值,您可以简单地将其转换为字节

byte[] lpData = new byte[] { (byte)5 };
于 2009-01-14T16:21:58.933 回答