繁体   English   中英

ERROR_MORE_DATA — PVOID和C#—非托管类型

[英]ERROR_MORE_DATA — PVOID and C# — Unmanaged types

如何从以下DLL获取值? offreg.dll。

在下面的代码中,我已经成功打开了配置单元,密钥,现在我试图获取密钥的值,并且继续遇到ERROR_MORE_DATA(234)错误。

这是C ++ .dll:

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
    );

这是我的C#代码:

        [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 StringBuilder pvData, out uint pcbData);

            IntPtr myHive;            
            IntPtr myKey;
            StringBuilder myValue = new StringBuilder("", 256);
            uint pdwtype;
            uint pcbdata;

 uint ret3 = ORGetValue(myKey, "", "DefaultUserName", out pdwtype, out myValue, out pcbdata);

因此,问题似乎与PVOID pvData有关,我似乎无法获得正确的类型或正确的缓冲区大小。 始终出现234错误。

注意:运行此命令pcbdata = 28 ...时,256应该足够了。

任何帮助将不胜感激。

如上所示,我尝试了字符串生成器...字符串... IntPtr ...等。这些都无法处理PVData ...

谢谢。

您需要先将pcbData初始化为缓冲区的大小,然后再传入。记住C不知道您要传递的缓冲区有多大,传入的pcbData值告诉函数pvData的大小。 在您的情况下,您传入的是零,告诉OrGetValue您pvData是一个0字节的缓冲区,因此它会响应告诉您它需要更大的缓冲区。

因此,在您的PInvoke定义中,pcbData应该是一个ref参数,并且要输入一个非零值:

[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 StringBuilder pvData, ref uint pcbData);

IntPtr myHive;            
IntPtr myKey;
StringBuilder myValue = new StringBuilder("", 256);
uint pdwtype;
uint pcbdata = myValue.Capacity();

uint ret3 = ORGetValue(myKey, "", "DefaultUserName", out pdwtype, out myValue, ref pcbdata);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM