我正在尝试使用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#中调整缓冲区。任何帮助或指针将不胜感激。
谢谢。
答案 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
而不是字符串。
一般规则是,如果参数为LPCTSTR
(LPCSTR
,LPCWSTR
),则使用字符串,如果参数为LPTSTR
(LPSTR
, LPWSTR
)然后使用StringBuilder
。