Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to import void * C API into C#?

Given this C API declaration how would it be imported to C#?

int _stdcall z4ctyget(CITY_REC *, void *);

I've been able to get this far:

   [DllImport(@"zip4_w32.dll",
        CallingConvention = CallingConvention.StdCall,
        EntryPoint = "z4ctygetSTD",
        ExactSpelling = false)]
    private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);

Naturally in C# the "void *" doesn't compile.

Some Googling indicates that it should be translated as "object." Which seems like it should work. But others indicate that "Void * is called a function pointer in C/C++ terms which in C# terms is a delegate". That doesn't make a whole lot of sense here as what would it delegate to? Some similar calls for other APIs found through Googling use other functions in the respective API. But in this API no other call would make sense.

The documentation for the call shows an example:

z4ctyget(&city, “00000”);

Which seems to show that even a static value could be passed.

It will compile with object in place of the void *. I don't know whether this is right and I haven't had an opportunity to test it (licensing issue).

like image 244
Mike Chess Avatar asked Feb 06 '09 19:02

Mike Chess


1 Answers

For the void* parameter you can just use an IntPtr

  [DllImport(@"zip4_w32.dll",
        CallingConvention = CallingConvention.StdCall,
        EntryPoint = "z4ctygetSTD",
        ExactSpelling = false)]
    private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr);
like image 141
JaredPar Avatar answered Oct 06 '22 22:10

JaredPar