编组 LPBYTE
Posted
技术标签:
【中文标题】编组 LPBYTE【英文标题】:Marshaling LPBYTE 【发布时间】:2017-11-13 17:55:40 【问题描述】:我有 hex_data 结构作为 DLL 函数的输出。
typedef struct hex_data
USHORT usLength;
LPBYTE lpbData;
HEXDATA
其中 lpbData 是指向字节流的指针,usLength 是 lpbData 指向的字节流的长度。现在我需要将此结构编组为 C# 结构。在下面的结构定义中,我应该为 lpbData 使用什么未管理的类型:
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct HEXDATA
[MarshalAs(UnmanagedType.U2)]
public UInt16 usLength;
[MarshalAs(UnmanagedType.?????)]
public byte[] lpbData;
;
谢谢
【问题讨论】:
How do I marshal a struct that contains a variable-sized array to C#?的可能重复 这样的结构有一个令人讨厌的内存管理问题,不清楚是谁负责释放 LPBYTE 指向的内存。因此,您不能将其声明为 byte[],而必须使用IntPtr
。 Marshal::Copy() 复制它,希望 usLength 告诉你很多字节。但是您必须考虑正确清理需要发生什么。
顺便说一下,这个结构命名错误。这里没有十六进制。十六进制是数字的基数 16 表示。您在这里拥有的是简单的字节数组。根本没有代表。
【参考方案1】:
应该是
[StructLayout(LayoutKind.Sequential)]
public struct HEXDATA
public ushort usLength;
public IntPtr lpbData;
;
pack 通常不需要(通常仅当在 C/C++ 大小上指定了 pack 时)。这里没有字符串,所以也不需要 CharSet。
【讨论】:
【参考方案2】:LPBYTE
是指向字节数组的指针。由于它是指向数组的指针,因此您将使用 LPArray
类型。
https://docs.microsoft.com/en-us/dotnet/framework/interop/default-marshaling-for-arrays
【讨论】:
感谢您的回复,但问题是我没有使用 LPArray 的 SizeConst。以上是关于编组 LPBYTE的主要内容,如果未能解决你的问题,请参考以下文章