2010-04-12 81 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