ERROR_MORE_DATA ---- чтение из реестра - PullRequest
0 голосов
/ 12 апреля 2010

Я пытаюсь создать автономный реестр в памяти, используя файл offreg.dll, предоставленный в пакете windows ddk 7.

Более подробную информацию о offreg.dll вы можете найти здесь: MSDN

В настоящее время при попытке прочитать значение из открытого куста / ключа реестра я получаю следующую ошибку: 234 или ERROR_MORE_DATA

Вот код .h, который содержит ORGetValue:

DWORD
ORAPI
ORGetValue (
    __in ORHKEY     Handle,
    __in_opt PCWSTR lpSubKey,
    __in_opt PCWSTR lpValue,
    __out_opt PDWORD pdwType,
    __out_bcount_opt(*pcbData) PVOID pvData,
    __inout_opt PDWORD pcbData
    );

Вот код, который я использую для извлечения данных

[DllImport("offreg.dll", CharSet = CharSet.Auto, EntryPoint = "ORGetValue", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        public static extern uint ORGetValue(IntPtr Handle, string lpSubKey, string lpValue, out uint pdwType, out string pvData, out uint pcbData);

        IntPtr myHive;            
        IntPtr myKey;
        string myValue;
        uint pdwtype;
        uint pcbdata;    

uint ret3 = ORGetValue(myKey, "", "DefaultUserName", out pdwtype, out myValue, out pcbdata);

Цель - прочитать myValue в виде строки.

Я не уверен, нужно ли мне использовать маршалинг ... или второй вызов с настроенным буфером ... Или действительно, как настроить буфер в C #. Любая помощь или указатели будут с благодарностью.

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 апреля 2010

Атрибут в аргументе pcbData неверен, это ref, а не out. Вам нужно инициализировать его в Capacity объекта StringBuilder, который вы передаете для аргумента pvData. Прямо сейчас функция API, вероятно, видит 0, поэтому вернет код ошибки.

Это должно выглядеть примерно так:

[DllImport("offreg.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint ORGetValue(IntPtr Handle, string lpSubKey, string lpValue, out int pdwType, StringBuilder pvData, ref int pcbData);

  int pdwtype;
  var buffer = new StringBuilder(256);
  int pcbdata = buffer.Capacity;
  uint ret3 = ORGetValue(myKey, "", "DefaultUserName", out pdwtype, buffer, ref pcbdata);
  string myValue = buffer.ToString();
0 голосов
/ 12 апреля 2010

Для строковых параметров вы должны использовать StringBuilder, а не строку.

Общее правило: если параметр является LPCTSTR (LPCSTR, LPCWSTR), тогда используйте строку, если параметр LPTSTR (LPSTR, LPWSTR), то используйте StringBuilder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...