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

时间:2015-08-01 02:19:57

标签: c# ffmpeg pinvoke

我尝试通过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.Zero选项,所以我这样说:

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

并抛出AccessViolation异常。

但是当我从签名中删除ref并直接将IntPtr.Zero传递给它时,它确实有效。 我认为使用ref关键字的签名是正确的方式,但我不知道为什么异常会抛出。

1 个答案:

答案 0 :(得分:0)

您无法使用

执行此操作
ref IntPtr options

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

IntPtr options

你通过了IntPtr.Zero

您可以使用两个重载执行此操作。一个就像你想要接收一个选项对象时的那个,以及一个如你没有那样的答案。或者,您可以使用单个重载,即此答案中的版本,并在需要接收选项变量时手动固定IntPtr变量。