2010-04-12 136 views
0

我想在windows ddk 7软件包中使用offreg.dll在内存中创建一个脱机注册表。ERROR_MORE_DATA ----从注册表中读取

你可以找到在这里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#中的缓冲区。任何帮助或指针将不胜感激。

谢谢。

回答

1

pcbData参数的属性是错误的,它是ref,没有。您需要将它初始化为您为pvData参数传递的StringBuilder的容量。现在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

不太确定代码中会出现什么样子,使用我上面的示例,您能否偶然演示一个演示? 谢谢。 – user314749 2010-04-12 19:13:47

+0

顺便说一下,buffer.Append(“DefaultUserName”);不需要。 – user314749 2010-04-12 20:03:27

0

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

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

+0

如果该参数为PVOID就像我上面的例子吗? – user314749 2010-04-12 17:24:55

+0

@ user314749:我想你也会在这种情况下需要一个StringBuilder。这取决于你通过什么类型的价值。对于每种类型的数据,您可能会有多个不同的DllImport。 – 2010-04-12 17:27:53

+0

我知道,当从注册表中提取值时,没有定义的值类型...它可以是字符串或整数等我相信这就是为什么它定义为PVOID ... 所以...我试图使用stringbuilder: out StringBuilder pvData, StringBuilder myValue = new StringBuilder(“”,256); 但是我仍然收到ERROR_MORE_DATA。 – user314749 2010-04-12 17:32:17