编组 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的主要内容,如果未能解决你的问题,请参考以下文章

PInvoke - 如何编组'SomeType * []'?

“纯”调度接口编组

JAXB 编组超类

当类在另一个命名空间中时编组 .NET 对象

编组 LPBYTE

为啥 JAXB 需要一个无参数构造函数来编组?