Вам нужно разыменовать указатель на массив, чтобы получить массив, затем для каждого элемента в массиве вам нужно разыменовать этот элемент, чтобы получить экземпляр PCREDENTIALS
.
Я нашел это сообщение с примером кода для выполнения того, что вы хотите сделать:
[DllImport("advapi32", SetLastError = true, CharSet=CharSet.Unicode)]
static extern bool CredEnumerate(string filter, int flag, out int count, out IntPtr
pCredentials);
...
int count = 0;
IntPtr pCredentials = IntPtr.Zero;
IntPtr[] credentials = null;
bool ret = CredEnumerate(null, 0, out count, out pCredentials);
if (ret != false)
{
credentials = new IntPtr[count];
IntPtr p = pCredentials;
for (int n = 0; n < count; n++)
{
credentials[n] = Marshal.ReadIntPtr(pCredentials,
n * Marshal.SizeOf(typeof(IntPtr)));
}
}
else
// failed....
Затем для каждого указателя вам нужно будет использовать Marshal.PtrToStructure
для разыменования указателя в экземпляр структуры PCREDENTIALS
(извините, я нигде не могу найти typedef для PCREDENTIALS
, я предполагаю, что он у вас есть - и если вы не забудете правильные атрибуты MarshalAs и атрибут StructLayout при его определении):
// assuming you have declared struct PCREDENTIALS
var creds = new List<PCREDENTIALS>(credentials.Length);
foreach (var ptr in credentials)
{
creds.Add((PCREDENTIALS)Marshal.PtrToStructure(ptr, typeof(PCREDENTIALS)));
}
Очевидно, вы захотите объединить пример и код PtrToStructure
для получения оптимальных результатов, но я хотел оставить целостность примера без изменений.