ERROR_MORE_DATA ----从注册表中读取

时间:2010-04-12 17:16:01

标签: c# c++ dll

我正在尝试使用windows ddk 7软件包中提供的offreg.dll在内存中创建一个脱机注册表。

您可以在此处找到有关offreg.dll的更多信息:MSDN

目前,在尝试从打开的注册表配置单元/密钥读取值时,我收到以下错误:234或ERROR_MORE_DATA

以下是包含ORGetValue的.h代码:

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 个答案:

答案 0 :(得分:1)

pcbData参数的属性是错误的,它是ref,而不是out。您需要将其初始化为您为pvData参数传递的StringBuilder的Capacity。现在,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();

答案 1 :(得分:0)

对于输出字符串参数,您应该使用StringBuilder而不是字符串。

一般规则是,如果参数为LPCTSTRLPCSTRLPCWSTR),则使用字符串,如果参数为LPTSTRLPSTRLPWSTR)然后使用StringBuilder