registry - "RegEnumKeyEx" returns array of empty strings (C# invoke) -


i have list of subkeys , list of values in registry branch.

[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);   // names of subkeys underneath registry key. public string[] getsubkeynames() {     lock(this)     {         if(hkey != intptr.zero)         {             // number of subkey names under 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 array hold 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 final name array caller.             return names;         }         return new string [0];     } } 

it works well, first element. returns keyname 0-index, other returns "".

how can be?

btw: replaced definition yours, work well

what p/invoke definition regenumkeyex?

perhaps, try one:

[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); 

from pinvoke.net site takes stringbuilder instead of character array. rule out potential errors in code don't show such arraytostring , in p/invoke definition, don't show.


Comments