2012-05-30 2 views
0
DWORD OREnumValue(
    __in   ORHKEY Handle, 
    __in   DWORD dwIndex, 
    __out  PWSTR lpValueName, 
    __inout  PDWORD lpcValueName, 
    __out_opt PDWORD lpType, 
    __out_opt PBYTE lpData, 
    __inout_opt PDWORD lpcbData 
); 

Мой код:DllImport ERROR_MORE_DATA неуправляемых Вызов C++ в C# PByte

public static extern uint OREnumValue(IntPtr Handle, uint dwIndex, [MarshalAsAttribute(UnmanagedType.LPWStr)] out StringBuilder lpValueName, ref int lpcValueName, out uint lpType, out IntPtr lpData, ref int lpcbData); 

    IntPtr Handle=mykey; 
    uint dwIndex=0; 

    StringBuilder lpValueName = new StringBuilder(16383); 
    int lpcValueName=lpValueName.Capacity; 

    uint lpType=0; 
    IntPtr lpData; 
    int lpcbData = int.MaxValue; 

    uint ret3= OREnumValue(Handle, dwIndex, out lpValueName, ref lpcValueName, out lpType, out lpData, ref lpcbData); 

Это дает ошибку:

ret3=ERROR_MORE_DATA 259 

Я думаю, проблема либо в

  1. lpData - что я должен использовать для PBYTE? Или
  2. lpcbData - в какой емкости я должен использовать?

Из MSDN

If the buffer specified by lpData is not large enough to hold the data, the function returns ERROR_MORE_DATA and stores the required buffer size in the variable pointed to by lpcbData. In this case, the contents of lpData are undefined.

+2

Во многом такой же, как ваш предыдущий вопрос, на этот раз это RegEnumValue. Найти объявления pinvoke на www.pinvoke.net –

+0

Я попробовал выборку здесь http://www.pinvoke.net/default.aspx/advapi32/RegEnumValue.html возвращает ERROR_MORE_DATA – John

+0

'PBYTE' звучит как' byte [] 'that необходимо заполнить. – leppie

ответ

1

Вы никогда не должны явным образом определить длину строки строителей, это значение должно быть получено с помощью метода RegQueryInfoKey, который даст вам длину в байтах самого длинного имени значения, subkey name и value data, которые затем можно использовать для инициализации строковых построителей и массивов байт, получающих фактические имена и данные. Это означает, что у вас есть минимально возможный объем используемой памяти, хотя он все еще достаточно велик, чтобы содержать результат. Я уверен, что ваша проблема связана с длиной, определенной вами для lpValueName.

Также вы должны использовать UIntPtr, а не IntPtr, а поле lpData должно быть байтовым массивом, если вы хотите данные.

+0

Это похоже на хороший ответ - небольшой пример кода, демонстрирующий правильное использование, также поможет! – Hannele

Смежные вопросы