Я пытаюсь написать оболочку C # вокруг библиотеки свечей Windows, и я застрял в этой функции:
typedef void* candle_list_handle;
DLL bool __stdcall candle_list_scan(candle_list_handle *list);
Вот что я пробовал:
[DllImport("candle_api.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool candle_list_scan(ref IntPtr listPtr);
public candle_list_t? Scan()
{
IntPtr ptr = new IntPtr();
var res = candle_list_scan(ref ptr);
var list = Marshal.PtrToStructure<candle_list_t>(ptr);
if (res)
{
return list;
}
else
return null;
}
Я тоже пробовал:
[DllImport("candle_api.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool candle_list_scan(ref IntPtr listPtr);
public candle_list_t? Scan()
{
IntPtr ptr = new IntPtr();
var res = candle_list_scan(ref ptr);
var list = Marshal.PtrToStructure<candle_list_t>(ptr);
if (res)
{
return list;
}
else
return null;
}
Но ни один из них не работал должным образом. Вот код C, где он устанавливает список:
bool __stdcall candle_list_scan(candle_list_handle *list)
{
if (list==NULL) {
return false;
}
candle_list_t *l = (candle_list_t *)calloc(1, sizeof(candle_list_t));
*list = l;
if (l==NULL) {
return false;
}
....
, а список_вечей:
typedef struct {
uint8_t num_devices;
candle_err_t last_error;
candle_device_t dev[CANDLE_MAX_DEVICES];
} candle_list_t;
который я преобразовал в
public struct candle_list_t
{
public byte num_devices;
public candle_err_t last_error;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public candle_device_t[] dev;
}
Используя мой первый метод, значение num_devices имеет значение, но оно недопустимо, поскольку оно превышает предел, который может быть в num_devices для кода в библиотеке C. Используя второй метод, я просто получаю пустую структуру.