LPBYTE作为特定长度的数组

时间:2015-05-06 13:00:48

标签: c# c#-4.0 interop pinvoke unmanaged

我需要导入一个描述为

的C函数
int Read(LPBYTE data, LPBYTE lengthOfData);

文档说明如下:

数据

[out]读取的数据

lengthOfData

[out]读取的数据长度

以下是使用此功能的示例:

int num = 0;
BYTE data[16] = {0};
while (num < 6)
{
   int dataLen = 0;
   Read(data, &dataLen);
   num += dataLen;
}

如何导入此功能?
据我所知,第一个参数是一个字节数组。

我可以将其导入为:

public static extern int Read([Out] IntPtr data, [Out] byte dataLength);

或者我应该使用out关键字,也许?

1 个答案:

答案 0 :(得分:0)

如果功能真的如此:

int Read(LPBYTE data, LPBYTE lengthOfData);

然后正确的翻译将是:

[DllImport(..., CallingConvention = CallingConvention.Cdecl)]
static extern int Read([Out] byte[] data, out byte dataLength);

但这与您的C代码不符。 C代码甚至不会编译你。也许第二个参数实际上是int

要调用此函数,您需要在调用之前分配数组。

byte[] data = new byte[16];
byte dataLength;
int retval = Read(data, out dataLength);

您需要清除以下详细信息:

  • 第二个参数的类型是什么?
  • 什么是召集惯例?
  • 您如何确定如何预先分配数组?

该函数设计不当,因为它不允许调用者指定数组的长度,从而存在缓冲区溢出的风险。