ERROR_MORE_DATA - 从注册表读取

我想创建一个使用在Windows中提供的offreg.dll DDK 7包脱机注册表在内存中。

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

谢谢。

--------------解决方案-------------

在pcbData参数的属性是错误的,这是裁判,不出来。 你需要把它初始化为传入的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();

对于出字符串参数,你应该使用StringBuilder不串。

一般的规则是,如果该参数是LPCTSTR然后使用字符串,如果该参数是LPCSTR LPCWSTR LPTSTR然后使用LPSTR LPWSTR StringBuilder

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#,DLL
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.699 (s). 10 q(s)