Pinvoke signature

Viewed 48

I am trying to find the correct PInvoke signature for the following C code. I already tried several variants but I always get a stack unbalanced exception.

typedef struct oem_device
 {
     unsigned int number_sensor_width;
     unsigned int number_sensor_height;
     float sensor_surface_cm2;
     char* serial;
     char* id;
     char* bootloader_firmware;
     char* micro_firmware;
     char* cpld_firmware;
     char* wifi_firmware;
     char* hardware_version;
 
 }OEM_DEVICE ;
 
 
 typedef struct oem_device_manager
 {
     void (*device_has_connected)(OEM_DEVICE device_connected);
     void (*device_has_disconnected)(OEM_DEVICE device_disconnected);
     void (*device_status_update)(OEM_DEVICE device, unsigned int status);
     void (*device_acquisition_available)(OEM_DEVICE device, unsigned int* millisecond, unsigned int size);
 
 }*P_OEM_DEVICE_MANAGER,OEM_DEVICE_MANAGER;

bool register_device_manager(P_OEM_DEVICE_MANAGER manager);

I tried the following C# code

[StructLayout(LayoutKind.Sequential)]
public struct oem_device
{
  uint number_sensor_width;
  uint number_sensor_height;
  float sensor_surface_cm2;
  IntPtr serial;
  IntPtr id;
  IntPtr bootloader_firmware;
  IntPtr micro_firmware;
  IntPtr cpld_firmware;
  IntPtr wifi_firmware;
  IntPtr hardware_version;
}

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void device_has_connectedD(oem_device device_connected);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void device_has_disconnectedD(oem_device device_disconnected);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void device_status_updateD(oem_device device, uint status);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void device_acquisition_availableD(oem_device device, ref uint millisecond, uint size);

[StructLayout(LayoutKind.Sequential)]
public struct oem_device_manager
{
    [MarshalAs(UnmanagedType.FunctionPtr)] public device_has_connectedD device_has_connected;
    [MarshalAs(UnmanagedType.FunctionPtr)] public device_has_disconnectedD device_has_disconnected;
    [MarshalAs(UnmanagedType.FunctionPtr)] public device_status_updateD device_status_update;
    [MarshalAs(UnmanagedType.FunctionPtr)] public device_acquisition_availableD device_acquisition_available;
}


[DllImport(@"OEM_DLL.dll")]
public static extern bool register_device_manager(oem_device_manager manager);

But when I call the register_device_manager I always get a stack unbalanced exception.

0 Answers
Related