We help IT Professionals succeed at work.
Get Started

Calling unamanged function which takes a pointer to pointer parameter

202 Views
Last Modified: 2019-12-30
I am trying to call  a function in C from my .Net Core application. The C function comes from libmpv render.h and the head looks like this:
   
int mpv_render_context_create(mpv_render_context **res, mpv_handle *mpv, mpv_render_param *params);

Open in new window

The problem is, that I have no clue how to call the function from C#.
First of all I have declared the MpvRenderParam struct as follows in C#:
   
[StructLayout(LayoutKind.Sequential)]
public unsafe struct MpvRenderParam
{
    public MpvRenderParamType Type;
    public void* Data;
}

Open in new window


Previously I have defined the Data field to be of type
IntPtr

Open in new window

but in my opinion it makes more sense when it can be an all purpose pointer, so it matches the definition of the C Library.

Following is the MpvRenderParamType enum:

    public enum MpvRenderParamType
    {
        Invalid = 0,
        ApiType = 1,
        InitParams = 2,
        Fbo = 3,
        FlipY = 4,
        Depth = 5,
        IccProfile = 6,
        AmbientLight = 7,
        X11Display = 8,
        WlDisplay = 9,
        AdvancedControl = 10,
        NextFrameInfo = 11,
        BlockForTargetTime = 12,
        SkipRendering = 13,
        DrmDisplay = 14,
        DrmDrawSurfaceSize = 15,
        DrmDisplayV2 = 15
    }

Open in new window


The actual problem


Now I have explained all the data types that were transcribed to C# but the problem still lies in creating the correct definition of the mpv_render_context_create and calling it.
First I tried to define the method like this:
[DllImport("mpv-1.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int mpv_render_context_create([Out] out IntPtr renderContext, IntPtr mpvHandle,
        MpvRenderParam[] parameters);

Open in new window


And I called it with:
var ptr = IntPtr.Zero;
var apiTypePtr = Marshal.StringToHGlobalAuto("opengl");
var i = mpv_render_context_create(out ptr, _mpvHandle, new []
{
    new MpvRenderParam(MpvRenderParamType.ApiType, apiTypePtr),
    new MpvRenderParam(MpvRenderParamType.Invalid, IntPtr.Zero
});

Open in new window


I also tried changing the first parameter to be a ref or IntPtr but no matter what combination of parameter type and calling it, I always got the same exception:
Exception thrown at 0x0000000055C73D60 (mpv-1.dll) in Otchi.App.exe: 0xC0000005: Access violation reading location 0x0000000000000010.
My last attempt was going into the unsafe part of C# and declaring the method like this:
[DllImport(LibName, CallingConvention = CallingConvention.Cdecl)]
private static extern unsafe int mpv_render_context_create(IntPtr* renderContext, IntPtr mpvHandle,
    MpvRenderParam[] parameters);

Open in new window


And calling it with the following piece of code:
IntPtr ptr;
var test = GCHandle.Alloc("opengl");
var test2 = GCHandle.ToIntPtr(test);
var apiTypePtr = Marshal.StringToHGlobalAuto("opengl");
var i = mpv_render_context_create(&ptr, _mpvHandle, new []
{
    new MpvRenderParam{Type = MpvRenderParamType.ApiType, Data = &apiTypePtr},

    new MpvRenderParam{Type = MpvRenderParamType.Invalid, Data = null}
});

Open in new window


No matter what I tried, I always get the same exception. How can I call the mpv_render_context_create without it throwing an AccessViolationException?
Comment
Watch Question
Architect - Coder - Mentor
CERTIFIED EXPERT
Commented:
This problem has been solved!
Unlock 1 Answer and 5 Comments.
See Answer
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE