“RegEnumKeyEx"返回一个空字符串数组(c#调用)

本文关键字:一个 数组 调用 字符串 RegEnumKeyEx quot 返回 | 更新日期: 2023-09-27 17:53:34

我必须在注册表分支中获得子键列表和值列表。

[DllImport("advapi32.dll", EntryPoint="RegEnumKeyExW",
            CallingConvention=CallingConvention.Winapi)]
[MethodImpl(MethodImplOptions.PreserveSig)]
extern private static int RegEnumKeyEx(IntPtr hkey, uint index,
                        char[] lpName, ref uint lpcbName,
                            IntPtr reserved, IntPtr lpClass, IntPtr lpcbClass,
                        out long lpftLastWriteTime);

// Get the names of all subkeys underneath this registry key.
public String[] GetSubKeyNames()
{
    lock(this)
    {
        if(hKey != IntPtr.Zero)
        {
            // Get the number of subkey names under the key.
            uint numSubKeys, numValues;
            RegQueryInfoKey(hKey, null,IntPtr.Zero, IntPtr.Zero,out numSubKeys, IntPtr.Zero, IntPtr.Zero, out numValues,IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
            // Create an array to hold the names.
            String[] names = new String [numSubKeys];
            StringBuilder sb = new StringBuilder();
            uint MAX_REG_KEY_SIZE = 1024;
            uint index = 0;
            long writeTime;
            while (index < numSubKeys)
            {
                sb = new StringBuilder();
                if (RegEnumKeyEx(hKey,index,sb,ref MAX_REG_KEY_SIZE, IntPtr.Zero,IntPtr.Zero,IntPtr.Zero,out writeTime) != 0)
                {
                    break;
                }
                names[(int)(index++)] = sb.ToString();
            }
            // Return the final name array to the caller.
            return names;
        }
        return new String [0];
    }
}

现在可以正常工作了,但只适用于第一个元素。对于0索引返回keyname,但对于其他索引返回"。

怎么可能呢?

顺便说一句:我用你的定义代替了我的定义,工作得很好

“RegEnumKeyEx"返回一个空字符串数组(c#调用)

RegEnumKeyEx的p/Invoke定义是什么?

也许,试试这个:

[DllImport("advapi32.dll", EntryPoint = "RegEnumKeyEx")]
extern private static int RegEnumKeyEx(UIntPtr hkey,
    uint index,
    StringBuilder lpName,
    ref uint lpcbName,
    IntPtr reserved,
    IntPtr lpClass,
    IntPtr lpcbClass,
    out long lpftLastWriteTime);

来自pinvoke.net站点,它接受stringbuilder而不是字符数组。这将排除未显示的代码(如ArrayToString和P/Invoke定义)中的潜在错误,这些代码也未显示。

为什么要使用p/Invoke呢?您可以使用Registry类来代替…

using (RegistryKey key = Registry.LocalMachine.OpenSubKey("SomeKey"))
{
    string[] subKeys = key.GetSubKeyNames();
    string[] valueNames = key.GetValueNames();
    string myValue = (string)key.GetValue("myValue");
}