当双指针参数为NULL时,通过P/Invoke传递

本文关键字:通过 Invoke 传递 指针 参数 NULL | 更新日期: 2023-09-27 18:05:54

我尝试通过p/Invoke调用FFMPEG方法

 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

所以我的p/Invoke方法是这样定义的:

[DllImport("avformat-55", EntryPoint = "avformat_find_stream_info", CallingConvention = CallingConvention.Cdecl)]
    public extern static int AVFormatFindStreamInfo(IntPtr ic, ref IntPtr options);

,我需要传递一个IntPtr。0表示选项,所以我这样调用:

var p = IntPtr.Zero;
rst = AVFormatFindStreamInfo(context, ref p);

和AccessViolation异常抛出。

但是当我从签名中删除ref时,直接传递一个IntPtr。0的它次方,它是有效的。我认为ref关键字签名是正确的方式,但我不知道为什么异常抛出。

当双指针参数为NULL时,通过P/Invoke传递

不能这样做
ref IntPtr options

还将把IntPtr变量的地址传递给非托管代码。这个地址永远不能是NULL。如果您需要能够将NULL传递给非托管代码,它必须是

IntPtr options

通过IntPtr.Zero

可以通过两个重载来实现。当您想要接收一个选项对象时,您可以使用它;当您不想接收选项对象时,您可以使用这个答案中的一个。或者,您可以使用单个重载,即来自此答案的版本,并在需要接收选项变量时手动固定IntPtr变量。